Class List Collection links Methods List addFirst: aValue links <- Link new; value: aValue; link: links ] Methods List removeFirst self remove: self first ] Methods List select: aBlock ^ self inject: self class new into: [:x :y | (aBlock value: y) ifTrue: [x add: y]. x] ] Methods List size (links isNil) ifTrue: [ ^ 0 ] ifFalse: [ ^ links size ] ] Methods List add: aValue ordered: aBlock (links isNil) ifTrue: [ self addFirst: aValue] ifFalse: [ links <- links add: aValue whenFalse: aBlock ] ] Methods List addLast: aValue (links isNil) ifTrue: [ self addFirst: aValue ] ifFalse: [ links add: aValue whenFalse: [ :x :y | true ] ] ] Methods List reverseDo: aBlock (links notNil) ifTrue: [ links reverseDo: aBlock ] ] Methods List add: aValue ^ self addLast: aValue ] Methods List links ^ links "used to walk two lists in parallel " ] Methods List do: aBlock (links notNil) ifTrue: [ links binaryDo: [:x :y | aBlock value: y]] ] Methods List reject: aBlock ^ self select: [:x | (aBlock value: x) not ] ] Methods List remove: value (links notNil) ifTrue: [ links <- links removeValue: value ] ] Methods List addAll: aValue aValue do: [:x | self add: x ] ] Methods List collect: aBlock ^ self inject: self class new into: [:x :y | x add: (aBlock value: y). x ] ] Methods List first ^ (links notNil) ifTrue: links ifFalse: [ smalltalk error: 'first on empty list'] ]