1     class Iterable<T> where T : Comparable
2         def max =
3             let iterator = get_iterator
4             let mut result = iterator.get_next
5     
6             while iterator.move_next do
7                 let next = iterator.get_value
8                 if next > result then result = next
9     
10            result
11    
12    class Iterable<T> where T : Number
13        def sum =
14            let iterator = get_iterator
15            let mut result = 0
16    
17            while iterator.move_next do
18                let next = iterator.get_value
19                result += next
20    
21            result
22    
23    class Iterable<T>
24        def max_of<U> (f : T -> U) where U : Comparable =
25            let iterator = get_iterator
26            let mut result = f iterator.get_next
27    
28            while iterator.move_next do
29                let next = f iterator.get_value
30                if next > result then result = next
31    
32            result
33    
34        def map<U> (f : T -> U) =
35            let list = List<U>.new
36            for x in self do
37                let y = f x
38                list.add y
39    
40            list
41    
42        def filter (f : T -> bool) =
43            let list = List<T>.new
44            for x in self do
45                if f x then
46                    list.add x
47    
48            list
49    
50        def count (f : T -> bool) =
51            let mut count : u32 = 0
52            for x in self do
53                if f x then
54                    count += 1
55    
56            count
57    
58        def partition (f : T -> bool) =
59            let true_list = List<T>.new
60            let false_list = List<T>.new
61            for x in self do
62                let list = if f x then true_list else false_list
63                list.add x
64    
65            (true_list, false_list)
66    
67        def with_index =
68            let list = List<(u32, T)>.new
69            let mut index = 0
70            for x in self do
71                list.add (index, x)
72                index += 1
73    
74            list
75    
76        def try_find_index (f : T -> bool) =
77            let mut index : u32 = 0
78            for x in self do
79                if f x then
80                    return Some index
81    
82                index += 1
83    
84            None
85    
86        def find_index (f : T -> bool) = try_find_index f
87                                         |> unwrap_or_fail "no such item"
88    
89        def try_find (f : T -> bool) =
90            for x in self do
91                if f x then
92                    return Some x
93    
94            None
95    
96        def find (f : T -> bool) = try_find f |> unwrap_or_fail "no such item"
97    
98        def try_single =
99            let iterator = get_iterator
100           if iterator.move_next then
101               let result = iterator.get_value
102               assert not iterator.move_next
103               Some result
104           else
105               None
106   
107       def any (f : T -> bool) =
108           for x in self do
109               if f x then return true
110   
111           false
112   
113       def all (f : T -> bool) =
114           for x in self do
115               if not f x then return false
116   
117           true
118   
119       def fold<U> (init : U) (f : U * T -> U) : U =
120           let iterator = get_iterator
121           let mut acc = init
122           while iterator.move_next do
123               let x = iterator.get_value
124               acc = f acc x
125   
126           acc
127   
128       def min_by<U> (f : T -> U) where U : Comparable =
129           let iterator = get_iterator
130           let mut result = iterator.get_next
131           let mut min = f result
132   
133           while iterator.move_next do
134               let x = iterator.get_value
135               let value = f x
136               if value < min then
137                   min = value
138                   result = x
139   
140           result
141   
142       def (+)<U> (rhs : U) where U : Iterable<T> =
143           let list = List<T>.new
144           list.provision (try_size.unwrap_or 0 + rhs.try_size.unwrap_or 0)
145           for x in self do list.add x
146           for x in rhs do list.add x
147   
148           list.as_readonly
149   
150       def copy_to (list : mut List<T>) =
151           for x in self do
152               list.add x
153   
154       let to_mut_list (size : u32) =
155           let list = List<T>.new
156           list.provision size
157           copy_to list
158   
159           list
160   
161       def to_list =
162           let size = try_size.unwrap_or 4
163           to_mut_list size |> as_readonly
164   
165       def to_mut_list =
166           let size = try_size.unwrap_or 4 * 2
167           to_mut_list size
168   
169   class Iterable<String>
170       def join_to_string =
171           let separator @param = ", "
172           let iterator = get_iterator
173           let maybe_first = iterator.try_next
174           if maybe_first.is_none then return ""
175   
176           let sb = StringBuilder.new
177           sb.append maybe_first.unwrap
178           while iterator.move_next do
179               sb.append separator
180               sb.append iterator.get_value
181   
182           sb.create
183