-module(gleam@iterator_test). -compile(no_auto_import). -export([to_from_list_test/0, step_test/0, take_test/0, fold_test/0, map_test/0, flat_map_test/0, append_test/0, flatten_test/0, filter_test/0, repeat_test/0, cycle_test/0, unfold_test/0, range_test/0, drop_test/0, find_test/0, index_test/0, iterate_test/0, take_while_test/0, drop_while_test/0, scan_test/0, zip_test/0, chunk_test/0, sized_chunk_test/0, intersperse_test/0, any_test/0, all_test/0, group_test/0, reduce_test/0, last_test/0, empty_test/0, once_test/0, single_test/0, interleave_test/0]). -export_type([cat/0]). -type cat() :: {cat, integer()}. -spec to_from_list_test() -> gleam@should:expectation(). to_from_list_test() -> Test = fun(Subject) -> gleam@should:equal( gleam@iterator:to_list(gleam@iterator:from_list(Subject)), Subject ) end, Test([]), Test([1]), Test([1, 2]), Test([1, 2, 4, 8]). -spec step_test() -> gleam@should:expectation(). step_test() -> Test = fun(Subject) -> Step = gleam@iterator:step(gleam@iterator:from_list(Subject)), case Subject of [] -> gleam@should:equal(Step, done); [H | T] -> gleam@should:equal(Step, {next, H, gleam@iterator:from_list(T)}) end end, Test([]), Test([1]), Test([1, 2]), Test([1, 2, 3]). -spec take_test() -> gleam@should:expectation(). take_test() -> Test = fun(N, Subject) -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:take(gleam@iterator:from_list(Subject), N) ), gleam@list:take(Subject, N) ) end, Test(0, []), Test(1, []), Test(-1, []), Test(0, [0]), Test(1, [0]), Test(-1, [0]), Test(0, [0, 1, 2, 3, 4]), Test(1, [0, 1, 2, 3, 4]), Test(2, [0, 1, 2, 3, 4]), Test(22, [0, 1, 2, 3, 4]). -spec fold_test() -> gleam@should:expectation(). fold_test() -> Test = fun(Subject, Acc, F) -> gleam@should:equal( gleam@iterator:fold(gleam@iterator:from_list(Subject), Acc, F), gleam@list:fold(Subject, Acc, F) ) end, F@1 = fun(E, Acc@1) -> [E | Acc@1] end, Test([], [], F@1), Test([1], [], F@1), Test([1, 2, 3], [], F@1), Test([1, 2, 3, 4, 5, 6, 7, 8], [], F@1). -spec map_test() -> gleam@should:expectation(). map_test() -> Test = fun(Subject, F) -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:map(gleam@iterator:from_list(Subject), F) ), gleam@list:map(Subject, F) ) end, F@1 = fun(E) -> E * 2 end, Test([], F@1), Test([1], F@1), Test([1, 2, 3], F@1), Test([1, 2, 3, 4, 5, 6, 7, 8], F@1). -spec flat_map_test() -> gleam@should:expectation(). flat_map_test() -> Test = fun(Subject, F) -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:flat_map(gleam@iterator:from_list(Subject), F) ), gleam@list:flatten( gleam@list:map( gleam@list:map(Subject, F), fun gleam@iterator:to_list/1 ) ) ) end, F@1 = fun(I) -> gleam@iterator:range(I, I + 2) end, Test([], F@1), Test([1], F@1), Test([1, 2], F@1). -spec append_test() -> gleam@should:expectation(). append_test() -> Test = fun(Left, Right) -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:append( gleam@iterator:from_list(Left), gleam@iterator:from_list(Right) ) ), gleam@list:flatten([Left, Right]) ) end, Test([], []), Test([1], [2]), Test([1, 2], [3, 4]). -spec flatten_test() -> gleam@should:expectation(). flatten_test() -> Test = fun(Lists) -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:flatten( gleam@iterator:from_list( gleam@list:map(Lists, fun gleam@iterator:from_list/1) ) ) ), gleam@list:flatten(Lists) ) end, Test([[], []]), Test([[1], [2]]), Test([[1, 2], [3, 4]]). -spec filter_test() -> gleam@should:expectation(). filter_test() -> Test = fun(Subject, F) -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:filter(gleam@iterator:from_list(Subject), F) ), gleam@list:filter(Subject, F) ) end, Even = fun(X) -> (X rem 2) =:= 0 end, Test([], Even), Test([1], Even), Test([1, 2], Even), Test([1, 2, 3], Even), Test([1, 2, 3, 4], Even), Test([1, 2, 3, 4, 5], Even), Test([1, 2, 3, 4, 5, 6], Even). -spec repeat_test() -> gleam@should:expectation(). repeat_test() -> gleam@should:equal( gleam@iterator:to_list(gleam@iterator:take(gleam@iterator:repeat(1), 5)), [1, 1, 1, 1, 1] ). -spec cycle_test() -> gleam@should:expectation(). cycle_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:take( gleam@iterator:cycle(gleam@iterator:from_list([1, 2, 3])), 9 ) ), [1, 2, 3, 1, 2, 3, 1, 2, 3] ). -spec unfold_test() -> gleam@should:expectation(). unfold_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:take( gleam@iterator:unfold(2, fun(Acc) -> {next, Acc, Acc * 2} end), 5 ) ), [2, 4, 8, 16, 32] ), gleam@should:equal( gleam@iterator:to_list( gleam@iterator:take(gleam@iterator:unfold(2, fun(_) -> done end), 5) ), [] ), gleam@should:equal( gleam@iterator:to_list(gleam@iterator:unfold(5, fun(N) -> case N of 0 -> done; N@1 -> {next, N@1, N@1 - 1} end end)), [5, 4, 3, 2, 1] ). -spec range_test() -> gleam@should:expectation(). range_test() -> Test = fun(A, B, Expected) -> gleam@should:equal( gleam@iterator:to_list(gleam@iterator:range(A, B)), Expected ) end, Test(0, 0, []), Test(1, 1, []), Test(-1, -1, []), Test(0, 1, [0]), Test(0, 5, [0, 1, 2, 3, 4]), Test(1, -5, [1, 0, -1, -2, -3, -4]). -spec drop_test() -> gleam@should:expectation(). drop_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:drop(gleam@iterator:range(0, 10), 5) ), [5, 6, 7, 8, 9] ). -spec find_test() -> gleam@should:expectation(). find_test() -> gleam@should:equal( gleam@iterator:find(gleam@iterator:range(0, 10), fun(E) -> E =:= 5 end), {ok, 5} ), gleam@should:equal( gleam@iterator:find( gleam@iterator:range(0, 10), fun(E@1) -> E@1 > 10 end ), {error, nil} ), gleam@should:equal( gleam@iterator:find(gleam@iterator:empty(), fun(_) -> true end), {error, nil} ), gleam@should:equal( gleam@iterator:find( gleam@iterator:unfold( {cat, 1}, fun(Cat) -> {next, Cat, {cat, erlang:element(2, Cat) + 1}} end ), fun(Cat@1) -> erlang:element(2, Cat@1) =:= 10 end ), {ok, {cat, 10}} ). -spec index_test() -> gleam@should:expectation(). index_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:index( gleam@iterator:from_list( [<<"a"/utf8>>, <<"b"/utf8>>, <<"c"/utf8>>] ) ) ), [{0, <<"a"/utf8>>}, {1, <<"b"/utf8>>}, {2, <<"c"/utf8>>}] ). -spec iterate_test() -> gleam@should:expectation(). iterate_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:take( gleam@iterator:iterate(1, fun(X) -> X * 3 end), 5 ) ), [1, 3, 9, 27, 81] ). -spec take_while_test() -> gleam@should:expectation(). take_while_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:take_while( gleam@iterator:from_list([1, 2, 3, 2, 4]), fun(X) -> X < 3 end ) ), [1, 2] ). -spec drop_while_test() -> gleam@should:expectation(). drop_while_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:drop_while( gleam@iterator:from_list([1, 2, 3, 4, 2, 5]), fun(X) -> X < 4 end ) ), [4, 2, 5] ). -spec scan_test() -> gleam@should:expectation(). scan_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:scan( gleam@iterator:from_list([1, 2, 3, 4, 5]), 0, fun(El, Acc) -> Acc + El end ) ), [1, 3, 6, 10, 15] ). -spec zip_test() -> gleam@should:expectation(). zip_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:zip( gleam@iterator:from_list( [<<"a"/utf8>>, <<"b"/utf8>>, <<"c"/utf8>>] ), gleam@iterator:range(20, 30) ) ), [{<<"a"/utf8>>, 20}, {<<"b"/utf8>>, 21}, {<<"c"/utf8>>, 22}] ). -spec chunk_test() -> gleam@should:expectation(). chunk_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:chunk( gleam@iterator:from_list([1, 2, 2, 3, 4, 4, 6, 7, 7]), fun(N) -> N rem 2 end ) ), [[1], [2, 2], [3], [4, 4, 6], [7, 7]] ). -spec sized_chunk_test() -> gleam@should:expectation(). sized_chunk_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:sized_chunk( gleam@iterator:from_list([1, 2, 3, 4, 5, 6]), 2 ) ), [[1, 2], [3, 4], [5, 6]] ), gleam@should:equal( gleam@iterator:to_list( gleam@iterator:sized_chunk( gleam@iterator:from_list([1, 2, 3, 4, 5, 6, 7, 8]), 3 ) ), [[1, 2, 3], [4, 5, 6], [7, 8]] ). -spec intersperse_test() -> gleam@should:expectation(). intersperse_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:intersperse(gleam@iterator:empty(), 0) ), [] ), gleam@should:equal( gleam@iterator:to_list( gleam@iterator:intersperse(gleam@iterator:from_list([1]), 0) ), [1] ), gleam@should:equal( gleam@iterator:to_list( gleam@iterator:intersperse( gleam@iterator:from_list([1, 2, 3, 4, 5]), 0 ) ), [1, 0, 2, 0, 3, 0, 4, 0, 5] ). -spec any_test() -> gleam@should:expectation(). any_test() -> gleam@should:be_false( gleam@iterator:any( gleam@iterator:empty(), fun(N) -> (N rem 2) =:= 0 end ) ), gleam@should:be_true( gleam@iterator:any( gleam@iterator:from_list([1, 2, 5, 7, 9]), fun(N@1) -> (N@1 rem 2) =:= 0 end ) ), gleam@should:be_false( gleam@iterator:any( gleam@iterator:from_list([1, 3, 5, 7, 9]), fun(N@2) -> (N@2 rem 2) =:= 0 end ) ). -spec all_test() -> gleam@should:expectation(). all_test() -> gleam@should:be_true( gleam@iterator:all( gleam@iterator:empty(), fun(N) -> (N rem 2) =:= 0 end ) ), gleam@should:be_true( gleam@iterator:all( gleam@iterator:from_list([2, 4, 6, 8]), fun(N@1) -> (N@1 rem 2) =:= 0 end ) ), gleam@should:be_false( gleam@iterator:all( gleam@iterator:from_list([2, 4, 5, 8]), fun(N@2) -> (N@2 rem 2) =:= 0 end ) ). -spec group_test() -> gleam@should:expectation(). group_test() -> gleam@should:equal( gleam@iterator:group( gleam@iterator:from_list([1, 2, 3, 4, 5, 6]), fun(N) -> N rem 3 end ), gleam@map:from_list([{0, [3, 6]}, {1, [1, 4]}, {2, [2, 5]}]) ). -spec reduce_test() -> gleam@should:expectation(). reduce_test() -> gleam@should:equal( gleam@iterator:reduce(gleam@iterator:empty(), fun(X, Y) -> X + Y end), {error, nil} ), gleam@should:equal( gleam@iterator:reduce( gleam@iterator:from_list([1, 2, 3, 4, 5]), fun(X@1, Y@1) -> X@1 + Y@1 end ), {ok, 15} ). -spec last_test() -> gleam@should:expectation(). last_test() -> gleam@should:equal( gleam@iterator:last(gleam@iterator:empty()), {error, nil} ), gleam@should:equal( gleam@iterator:last(gleam@iterator:range(1, 10)), {ok, 9} ). -spec empty_test() -> gleam@should:expectation(). empty_test() -> gleam@should:equal(gleam@iterator:to_list(gleam@iterator:empty()), []). -spec once_test() -> gleam@should:expectation(). once_test() -> gleam@should:equal( gleam@iterator:to_list(gleam@iterator:once(fun() -> 1 end)), [1] ). -spec single_test() -> gleam@should:expectation(). single_test() -> gleam@should:equal(gleam@iterator:to_list(gleam@iterator:single(1)), [1]). -spec interleave_test() -> gleam@should:expectation(). interleave_test() -> gleam@should:equal( gleam@iterator:to_list( gleam@iterator:interleave( gleam@iterator:from_list([1, 2, 3, 4]), gleam@iterator:from_list([11, 12, 13, 14]) ) ), [1, 11, 2, 12, 3, 13, 4, 14] ), gleam@should:equal( gleam@iterator:to_list( gleam@iterator:interleave( gleam@iterator:from_list([1, 2, 3, 4]), gleam@iterator:from_list([100]) ) ), [1, 100, 2, 3, 4] ).