diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gleam__stdlib.erl | 6 | ||||
-rw-r--r-- | src/map.gleam | 132 |
2 files changed, 132 insertions, 6 deletions
diff --git a/src/gleam__stdlib.erl b/src/gleam__stdlib.erl index db80c1b..5942a0f 100644 --- a/src/gleam__stdlib.erl +++ b/src/gleam__stdlib.erl @@ -6,3 +6,9 @@ expect_equal(A, Expected) -> ?assertEqual(Expected, A). expect_not_equal(A, Expected) -> ?assertNotEqual(Expected, A). expect_true(A) -> ?assert(A). expect_false(A) -> ?assertNot(A). + +map_fetch(Map, Key) -> + case maps:find(Key, Map) of + error -> {error, {}}, + Found -> Found + end. diff --git a/src/map.gleam b/src/map.gleam index 0e41aa7..032ef90 100644 --- a/src/map.gleam +++ b/src/map.gleam @@ -1,4 +1,5 @@ import any +import result:Result import expect pub external type Map(key, value); @@ -21,12 +22,17 @@ test size { |> size |> expect:equal(_, 0) - [{1, 1}] + [ + {1, 1}, + ] |> from_list |> size |> expect:equal(_, 1) - [{"", 1.0}, {"", 2.0}] + [ + {"", 1.0}, + {"", 2.0}, + ] |> from_list |> size |> expect:equal(_, 2) @@ -45,17 +51,25 @@ test has_key { |> has_key(_, 1) |> expect:false - [{1, 0}] + [ + {1, 0}, + ] |> from_list |> has_key(_, 1) |> expect:true - [{4, 0}, {1, 0}] + [ + {4, 0}, + {1, 0}, + ] |> from_list |> has_key(_, 1) |> expect:true - [{4, 0}, {1, 0}] + [ + {4, 0}, + {1, 0}, + ] |> from_list |> has_key(_, 0) |> expect:false @@ -83,7 +97,10 @@ pub external fn from_list(List(Tuple(key, value))) -> Map(key, value) = 'maps' 'from_list' test from_list { - proplist = [{4, 0}, {1, 0}] + proplist = [ + {4, 0}, + {1, 0}, + ] map = from_list(proplist) map @@ -94,3 +111,106 @@ test from_list { |> to_list |> expect:equal(_, proplist) } + +pub external fn fetch(Map(key, value), key) -> Result(Unit, value) + = 'gleam__stdlib' 'map_fetch'; + +test fetch { + proplist = [ + {4, 0}, + {1, 1}, + ] + map = from_list(proplist) + + map + |> fetch(_, 4) + |> expect:equal(_, result:Ok(0)) + + map + |> fetch(_, 1) + |> expect:equal(_, result:Ok(1)) + + map + |> fetch(_, 2) + |> expect:equal(_, result:Error(())) +} + +external fn erl_put(key, value, Map(key, value)) -> Map(key, value) + = 'maps' 'put'; + +pub fn put(map, key, value) { + erl_put(key, value, map) +} + +test put { + new() + |> put(_, 'a', 0) + |> put(_, 'b', 1) + |> put(_, 'c', 2) + |> expect:equal(_, result:Ok(from_list([{'a', 0}, {'b', 1}, {'c', 2}]))) +} + +external fn erl_map_values(fn(key, value) -> value, Map(key, value)) -> Map(key, value) + = 'maps' 'map'; + +pub fn map_values(map, fun) { + erl_map_values(fun, map) +} + +test map_values { + [ + {1, 0}, + {2, 1}, + {3, 2}, + ] + |> from_list + |> map_values(_, fn(k, v) { k + v }) + |> expect:equal(_, from_list([{1, 0}, {2, 3}, {3, 5}])) +} + +pub external fn keys(Map(keys, _)) -> List(keys) + = 'maps' 'keys' + +test keys { + [ + {'a', 0}, + {'b', 1}, + {'c', 2}, + ] + |> from_list + |> keys + |> expect:equal(_, ['a', 'b', 'c'])) +} + +pub external fn values(Map(_, values)) -> List(values) + = 'maps' 'values' + +test values { + [ + {'a', 0}, + {'b', 1}, + {'c', 2}, + ] + |> from_list + |> values + |> expect:equal(_, [0, 1, 2])) +} + +external fn erl_filter(fn(key, value) -> Bool, Map(key, value)) -> Map(key, value) + = 'maps' 'filter'; + +pub fn filter(map, fun) { + filter(fun, map) +} + +test map_values { + [ + {1, 0}, + {3, 2}, + {2, 1}, + ] + |> from_list + |> filter(_, fn(k, v) { k + v < 4 }) + |> expect:equal(_, from_list([{1, 0}, {2, 3}])) +} + |