Add st-handle.h
[panda.git] / st / List.st
blobd60481659fd6451ff6328f128853ded31361fc93
3 "Link"
5 Link method!
6 value: anObject
7         value := anObject!
9 Link method!
10 value
11         ^ value!
13 Link method!
14 next: aLink
15         next := aLink!
17 Link method!
18 next
19         ^ next!
21 "List"  
23 List method!
24 add: anObject
25         | link |
27         link := Link new.
28         link value: anObject.
30         first == nil
31                 ifTrue: [first := link. last := link]
32                 ifFalse: [last next: link. last := link].
33                 
34         size := size + 1.
35         ^ anObject!
38 List method!
39 addFirst: anObject
40         | link |
42         link := Link new.
43         link value: anObject.
45         first == nil
46                 ifTrue:
47                         [ first := link.
48                           last := link ]
49                 ifFalse:
50                         [ link next: first.
51                           first := link ].
53         size := size + 1.
55         ^ anObject!
58 List method!
59 addLast: anObject
60         ^ self add: anObject!
62 List method!
63 do: aBlock
64         | link |
65         link := first.
66         [ link ~~ nil ]
67                 whileTrue: [aBlock value: link value.
68                                 link := link next]!
70 List method!
71 select: aBlock
72         | aStream link |
73         aStream := WriteStream on: (self species new: self size).
74         link := first.
75         [link ~~ nil ]
76                 whileTrue: [(aBlock value: link value)
77                                                 ifTrue: [aStream nextPut: (link value)].
78                                         link := link next]. 
79         ^ aStream contents!
81 List method!
82 collect: aBlock
83         | aStream link |
84         aStream := WriteStream on: (self species new: self size).
85         link := first.
86         [link ~~ nil]
87                 whileTrue: [aStream nextPut: (aBlock value: (link value)).
88                                         link := link next].
89         ^ aStream contents!
92 List method!
93 findLink: index
94         | i link |
96         i := 1.
97         link := first.
98         [ (link ~= nil) & (i < index) ]
99                 whileTrue: [ i := i + 1. link := link next].
101         self assert: [ link ~= nil ].
102         ^ link!
104 List method!
105 at: index
106         | link |
108         self emptyCheck.
110         (index < 1) | (index > size)
111                 ifTrue: [self error: 'out of bounds' ]. 
113         link := self findLink: index.
114         ^ link value!
116 List method!
117 at: index put: anObject
118         | link |
120         self emptyCheck.
122         (index < 1) | (index > size)
123                 ifTrue: [self error: 'out of bounds' ]. 
125         link := self findLink: index.
126         link value: anObject.
127         ^ anObject!
129 List method!
130 size
131         ^ size!
133 List method!
134 initialize
135         size := 0!
137 List method!
138 species
139         ^ Array!
141 List method!
142 first
143         self emptyCheck.
144         ^ first value!
146 List method!
147 last
148         self emptyCheck.
149         ^ last value!
151 List method!
152 removeFirst
153         | removed |
155         self emptyCheck.
157         removed := first value.
158         first == last
159                 ifTrue: [first := nil. last := nil]
160                 ifFalse: [first := first next].
162         size := size - 1.
163         ^ removed!
165 List method!
166 removeLast
167         | link removed |
169         self emptyCheck.
171         removed := last value.
172         first == last
173                 ifTrue: [first := nil. last := nil]
174                 ifFalse: [link := first.                
175                                   [link next == last ]
176                                           whileFalse: [ link := link next].
177                                   link next: nil.
178                                   last := link].
180         size := size - 1.
181         ^ removed!
183 List method!
184 remove: anObject ifAbsent: aBlock
185         | link next |
187         link := first.
188         link ifNil: [^ aBlock value].
190         link value = anObject
191                 ifTrue:  [first == last
192                                           ifTrue: [last := nil].
193                                   first := first next]
194                 ifFalse: [[link next ifNil: [^ aBlock value].
195                                    link next value ~= anObject]
196                                            whileTrue: [link := link next].
197                                    link next: link next next].
199         size := size - 1.
200         ^  anObject!
203 List method!
204 emptyCheck
205         first == nil ifTrue: [ self error: 'list is empty' ]!