12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- Smalltalk current createPackage: 'Trapped-Backend' properties: #{}!
- Object subclass: #EavModel
- instanceVariableNames: 'getBlock putBlock'
- package: 'Trapped-Backend'!
- !EavModel commentStamp!
- External actor value model.!
- !EavModel methodsFor: 'accessing'!
- getBlock: aBlock
- getBlock := aBlock
- !
- on: anObject
- "Returns value of model applied on object"
- ^getBlock value: anObject
- !
- on: anObject put: anObject2
- "Puts a value via model applied on object"
- ^putBlock value: anObject value: anObject2
- !
- putBlock: aBlock
- putBlock := aBlock
- ! !
- !EavModel methodsFor: 'initialization'!
- initialize
- super initialize.
- getBlock := [ self error: 'No getter block.' ].
- putBlock := [ self error: 'No putter block.' ].
- ! !
- Object subclass: #Isolator
- instanceVariableNames: 'root'
- package: 'Trapped-Backend'!
- !Isolator methodsFor: 'accessing'!
- root
- ^root
- !
- root: anObject
- root := anObject
- ! !
- !Isolator methodsFor: 'action'!
- model: anEavModel modify: aBlock
- | newValue |
- newValue := aBlock value: (anEavModel on: self).
- anEavModel on: self put: newValue deepCopy
- !
- model: anEavModel read: aBlock
- aBlock value: (anEavModel on: self) deepCopy
- ! !
- !Isolator class methodsFor: 'instance creation'!
- on: anObject
- ^self new root: anObject
- ! !
- !SequenceableCollection methodsFor: '*Trapped-Backend'!
- asEavModel
- | model |
- model := EavModel new.
- model getBlock: [ :anObject |
- self inject: anObject into: [ :soFar :segment |
- soFar ifNotNil: [ segment reverseTrapAt: soFar ]]].
- self isEmpty ifFalse: [
- model putBlock: [ :anObject :value | | penultimate |
- penultimate := self allButLast inject: anObject into: [ :soFar :segment |
- soFar ifNotNil: [ segment reverseTrapAt: soFar ]].
- self last reverseTrapAt: penultimate put: value ]].
- ^model
- ! !
|