diff options
Diffstat (limited to 'src/list.gleam')
-rw-r--r-- | src/list.gleam | 295 |
1 files changed, 147 insertions, 148 deletions
diff --git a/src/list.gleam b/src/list.gleam index 1d5b82e..338ee3c 100644 --- a/src/list.gleam +++ b/src/list.gleam @@ -1,5 +1,4 @@ import expect -import result:[Ok, Error] pub enum Error = | Empty @@ -9,9 +8,9 @@ pub enum Error = pub external fn length(List(a)) -> Int = "erlang" "length" test length { - length([]) |> expect:equal(_, 0) - length([1]) |> expect:equal(_, 1) - length([1, 1]) |> expect:equal(_, 2) + let _ = length([]) |> expect:equal(_, 0) + let _ = length([1]) |> expect:equal(_, 1) + let _ = length([1, 1]) |> expect:equal(_, 2) length([1, 1, 1]) |> expect:equal(_, 3) } @@ -20,8 +19,8 @@ test length { pub external fn reverse(List(a)) -> List(a) = "erlang" "reverse" test reverse { - length([]) |> expect:equal(_, []) - length([1, 2, 3, 4, 5]) |> expect:equal(_, [5, 4, 3, 2, 1]) + let _ = length([]) |> expect:equal(_, 0) + length([1, 2, 3, 4, 5]) |> expect:equal(_, 5) } pub fn is_empty(list) { @@ -29,21 +28,21 @@ pub fn is_empty(list) { } test is_empty { - is_empty([]) |> expect:true + let _ = is_empty([]) |> expect:true is_empty([1]) |> expect:false } -pub fn member(list, elem) { +pub fn has_member(list, elem) { case list { | [] -> False - | [head | rest] -> head == elem || member(rest, elem) + | [head | rest] -> head == elem || has_member(rest, elem) } } -test is_member { - is_member([0, 4, 5, 1], 1) |> expect:true - is_member([0, 4, 5, 7], 1) |> expect:false - is_member([], 1) |> expect:false +test has_member { + let _ = has_member([0, 4, 5, 1], 1) |> expect:true + let _ = has_member([0, 4, 5, 7], 1) |> expect:false + has_member([], 1) |> expect:false } pub fn head(list) { @@ -54,7 +53,7 @@ pub fn head(list) { } test head { - head([0, 4, 5, 7]) + let _ = head([0, 4, 5, 7]) |> expect:equal(_, Ok(0)) head([]) @@ -69,50 +68,50 @@ pub fn tail(list) { } test tail { - tail([0, 4, 5, 7]) + let _ = tail([0, 4, 5, 7]) |> expect:equal(_, Ok([4, 5, 7])) - tail([0]) + let _ = tail([0]) |> expect:equal(_, Ok([])) tail([]) |> expect:equal(_, Error(Empty)) } -fn do_filter(list, fun, acc) { - case list { - | [] -> reverse(acc) - | [x | xs] -> - let new_acc = - case fun(x) { - | True -> [x | acc] - | False -> acc - } - do_filter(xs, fun, new_acc) - } -} - -pub fn filter(list, fun) { - do_filter(list, fun, []) -} - -test filter { - [] - |> filter(_, fn(x) { True }) - |> expect:equal(_, []) - - [0, 4, 5, 7, 3] - |> filter(_, fn(x) { True }) - |> expect:equal(_, [0, 4, 5, 7, 3]) - - [0, 4, 5, 7, 3] - |> filter(_, fn(x) { x > 4 }) - |> expect:equal(_, [5, 7]) - - [0, 4, 5, 7, 3] - |> filter(_, fn(x) { x < 4 }) - |> expect:equal(_, [0, 3]) -} +// fn do_filter(list, fun, acc) { +// case list { +// | [] -> reverse(acc) +// | [x | xs] -> +// let new_acc = +// case fun(x) { +// | True -> [x | acc] +// | False -> acc +// } +// do_filter(xs, fun, new_acc) +// } +// } + +// pub fn filter(list, fun) { +// do_filter(list, fun, []) +// } + +// test filter { +// let _ = [] +// |> filter(_, fn(x) { True }) +// |> expect:equal(_, []) + +// let _ = [0, 4, 5, 7, 3] +// |> filter(_, fn(x) { True }) +// |> expect:equal(_, [0, 4, 5, 7, 3]) + +// let _ = [0, 4, 5, 7, 3] +// |> filter(_, fn(x) { x > 4 }) +// |> expect:equal(_, [5, 7]) + +// [0, 4, 5, 7, 3] +// |> filter(_, fn(x) { x < 4 }) +// |> expect:equal(_, [0, 3]) +// } fn do_map(list, fun, acc) { case list { @@ -126,7 +125,7 @@ pub fn map(list, fun) { } test map { - [] + let _ = [] |> map(_, fn(x) { x * 2 }) |> expect:equal(_, []) @@ -135,82 +134,82 @@ test map { |> expect:equal(_, [0, 8, 10, 14, 6]) } -pub fn do_traverse(list, fun, acc) { - case list { - | [] -> Ok(reverse(acc)) - | [x | xs] -> - case fun(x) { - | Ok(y) -> do_traverse(xs, fun, [y | acc]) - | Error(error) -> Error(error) - } - } -} - -pub fn traverse(list, fun) { - do_traverse(list, fun, []) -} - -test traverse { - fun = fn(x) { - case x < 6 { - True -> Ok(x * 2) - False -> Error(x) - } - } - - [0, 4, 5, 6, 3] - |> traverse(_, fun) - |> expect:equal(_, Ok([0, 8, 10, 12, 6])) - - [0, 4, 5, 7, 3] - |> traverse(_, fun) - |> expect:equal(_, Error(7))) -} - -pub fn drop(list, n) { - case n <= 0 { - | True -> list - | False -> - case list { - | [] -> [] - | [x | xs] -> drop(xs, n - 1) - } - } -} - -test drop/2 { - [] - |> drop(_, 5) - |> expect:equal(_, []) - - [1, 2, 3, 4, 5, 6, 7, 8] - |> drop(_, 5) - |> expect:equal(_, [6, 7, 8]) -} - -fn do_take(list, n, acc) { - case n <= 0 { - | True -> reverse(acc) - | False -> - case list { - | [] -> reverse(acc) - | [x | xs] -> take(xs, n - 1, [x | acc]) - } - } -} - -pub fn take(list, n) { - do_take(list, n, []) -} - -test take { - [] - |> take(_, 5) - |> expect:equal(_, []) - [1, 2, 3, 4, 5, 6, 7, 8] - |> take(_, 5) - |> expect:equal(_, [1, 2, 3, 4, 5]) -} +// pub fn do_traverse(list, fun, acc) { +// case list { +// | [] -> Ok(reverse(acc)) +// | [x | xs] -> +// case fun(x) { +// | Ok(y) -> do_traverse(xs, fun, [y | acc]) +// | Error(error) -> Error(error) +// } +// } +// } + +// pub fn traverse(list, fun) { +// do_traverse(list, fun, []) +// } + +// test traverse { +// let fun = fn(x) { +// case x < 6 { +// | True -> Ok(x * 2) +// | False -> Error(x) +// } +// } + +// let _ = [0, 4, 5, 6, 3] +// |> traverse(_, fun) +// |> expect:equal(_, Ok([0, 8, 10, 12, 6])) + +// [0, 4, 5, 7, 3] +// |> traverse(_, fun) +// |> expect:equal(_, Error(7)) +// } + +// pub fn drop(list, n) { +// case n <= 0 { +// | True -> list +// | False -> +// case list { +// | [] -> [] +// | [x | xs] -> drop(xs, n - 1) +// } +// } +// } + +// test drop { +// let _ = [] +// |> drop(_, 5) +// |> expect:equal(_, []) + +// [1, 2, 3, 4, 5, 6, 7, 8] +// |> drop(_, 5) +// |> expect:equal(_, [6, 7, 8]) +// } + +// fn do_take(list, n, acc) { +// case n <= 0 { +// | True -> reverse(acc) +// | False -> +// case list { +// | [] -> reverse(acc) +// | [x | xs] -> take(xs, n - 1, [x | acc]) +// } +// } +// } + +// pub fn take(list, n) { +// do_take(list, n, []) +// } + +// test take { +// let _ = [] +// |> take(_, 5) +// |> expect:equal(_, []) +// [1, 2, 3, 4, 5, 6, 7, 8] +// |> take(_, 5) +// |> expect:equal(_, [1, 2, 3, 4, 5]) +// } pub fn new() { [] @@ -220,30 +219,30 @@ test new { new() |> expect:equal(_, []) } -fn do_flatten(lists, acc) { - case lists { - | [] -> acc - | [l | rest] -> flatten(rest, acc ++ l) - } -} +// fn do_flatten(lists, acc) { +// case lists { +// | [] -> acc +// | [l | rest] -> flatten(rest, acc ++ l) +// } +// } -pub fn flatten(lists) { - do_flatten(lists, []) -} +// pub fn flatten(lists) { +// do_flatten(lists, []) +// } -test flatten { - flatten([]) - |> expect:equal(_, []) +// test flatten { +// let _ = flatten([]) +// |> expect:equal(_, []) - flatten([[]]) - |> expect:equal(_, []) +// let _ = flatten([[]]) +// |> expect:equal(_, []) - flatten([[], [], []]) - |> expect:equal(_, []) +// let _ = flatten([[], [], []]) +// |> expect:equal(_, []) - flatten([[1, 2], [], [3, 4]]) - |> expect:equal(_, [1, 2, 3, 4]) -} +// flatten([[1, 2], [], [3, 4]]) +// |> expect:equal(_, [1, 2, 3, 4]) +// } pub fn foldl(list, acc, fun) { case list { @@ -254,7 +253,7 @@ pub fn foldl(list, acc, fun) { test foldl { [1, 2, 3] - |> foldl(_, [], fn(x, acc) { x :: acc }) + |> foldl(_, [], fn(x, acc) { [x | acc] }) |> expect:equal(_, [3, 2, 1]) } @@ -267,6 +266,6 @@ pub fn foldr(list, acc, fun) { test foldr { [1, 2, 3] - |> foldr(_, [], fn(x, acc) { x :: acc }) + |> foldr(_, [], fn(x, acc) { [x | acc] }) |> expect:equal(_, [1, 2, 3]) } |