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