fork download
  1. "http://p...content-available-to-author-only...h.net/test/read.cgi/tech/1418278634/438"
  2.  
  3. Object subclass: Likes [
  4. | likes name |
  5.  
  6. initialize [likes := OrderedCollection new]
  7.  
  8. allOneLikes [^likes
  9. inject: #()
  10. into: [:arr :who | arr, (Likes members asArray select: who)]
  11. ]
  12.  
  13. definitelyLikes: who [
  14. (who isKindOf: BlockClosure) ifTrue: [
  15. ^(Likes members select: who) allSatisfy: [:each | self definitelyLikes: each]
  16. ].
  17. (who isKindOf: Collection) ifTrue: [
  18. ^who allSatisfy: [:each | self definitelyLikes: each]
  19. ].
  20. ^likes includes: who
  21. ]
  22.  
  23. likes: who [
  24. (who isKindOf: Collection)
  25. ifTrue: [likes addAll: who] ifFalse: [likes add: who].
  26. ^true
  27. ]
  28.  
  29. named: newName [name := newName]
  30.  
  31. value: who [^self == who]
  32.  
  33. printOn: aStream [aStream nextPutAll: name]
  34. ]
  35.  
  36. Likes class extend [
  37. | members |
  38.  
  39. members [^members ifNil: [self members: Set new; members]]
  40.  
  41. members: set [members := set asSet]
  42.  
  43. named: str [
  44. | instance |
  45. instance := self new initialize.
  46. instance named: str.
  47. ^instance
  48. ]
  49. ]
  50.  
  51. Likes subclass: Animals []
  52. Likes subclass: People []
  53.  
  54. | Kim Robin Sandy Lee cats |
  55.  
  56. Likes members: {
  57. Kim := People named: #Kim.
  58. Robin := People named: #Robin.
  59. Sandy := People named: #Sandy.
  60. Lee := People named: #Lee.
  61. cats := Animals named: #cats
  62. }.
  63.  
  64. Kim likes: Robin.
  65. "Lee likes: Kim."
  66. Sandy likes: Kim.
  67. Robin likes: cats.
  68. Sandy likes: [:who |
  69. ((who isKindOf: People) or: [who isKindOf: Animals]) and: [who definitelyLikes: cats]].
  70. Kim likes: [:who |
  71. (who isKindOf: People) and: [who definitelyLikes: {Lee. Kim}]].
  72. Sandy likes: Lee.
  73. Likes members do: [:who |
  74. ((who isKindOf: People) or: [who isKindOf: Animals]) ifTrue: [who likes: who]].
  75.  
  76. Likes members do: [:each | (each -> each allOneLikes) printNl]
Success #stdin #stdout 0.01s 335744KB
stdin
Standard input is empty
stdout
Robin->(cats Robin )
cats->(cats )
Kim->(Robin Sandy Kim )
Sandy->(Kim Robin cats Lee Sandy )
Lee->(Lee )