| 1 | import arrays |
| 2 | |
| 3 | type MyInt = int |
| 4 | |
| 5 | interface FoldCyclable { |
| 6 | id() int |
| 7 | } |
| 8 | |
| 9 | struct FoldWheel { |
| 10 | v int |
| 11 | } |
| 12 | |
| 13 | fn (w FoldWheel) id() int { |
| 14 | return w.v |
| 15 | } |
| 16 | |
| 17 | fn test_main() { |
| 18 | assert arrays.fold[int, []int]([1, 2, 3, 4], []int{}, fn (r []int, t int) []int { |
| 19 | return arrays.merge(r, [t]) |
| 20 | }) == [1, 2, 3, 4] |
| 21 | assert arrays.fold[string, []string](['a', 'b', 'c', 'd'], []string{}, fn (r []string, t string) []string { |
| 22 | return arrays.merge(r, [t]) |
| 23 | }) == ['a', 'b', 'c', 'd'] |
| 24 | assert arrays.fold[bool, []bool]([true, false], []bool{}, fn (r []bool, t bool) []bool { |
| 25 | return arrays.merge(r, [t]) |
| 26 | }) == [false, true] |
| 27 | assert arrays.fold[MyInt, []MyInt]([MyInt(0), 1], []MyInt{}, fn (r []main.MyInt, t MyInt) []main.MyInt { |
| 28 | return arrays.merge(r, [t]) |
| 29 | }) == [MyInt(0), 1] |
| 30 | assert arrays.fold([1, 2, 3, 4], [5, 6, 7], fn (r []int, t int) []int { |
| 31 | return r.map(it * t) |
| 32 | }) == [120, 144, 168] |
| 33 | } |
| 34 | |
| 35 | fn test_fold_with_interface_accumulator() { |
| 36 | items := [FoldWheel{1}, FoldWheel{2}] |
| 37 | result := arrays.fold[FoldWheel, FoldCyclable](items, FoldCyclable(FoldWheel{}), fn (_ FoldCyclable, elem FoldWheel) FoldCyclable { |
| 38 | return elem |
| 39 | }) |
| 40 | assert result.id() == 2 |
| 41 | } |
| 42 | |