aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2018-11-20 19:38:41 +0000
committerLouis Pilfold <louis@lpil.uk>2018-11-20 19:38:41 +0000
commit7675e45b733608aa21dd590c78e268e28087676c (patch)
tree595fbd20f56622ee14ba7d79995d9df574122d84 /src
parent6fc9588f3dde4ad3fa0be5cbeb0c6560b6debc98 (diff)
downloadgleam_stdlib-7675e45b733608aa21dd590c78e268e28087676c.tar.gz
gleam_stdlib-7675e45b733608aa21dd590c78e268e28087676c.zip
Additional maps
Diffstat (limited to 'src')
-rw-r--r--src/gleam__stdlib.erl6
-rw-r--r--src/map.gleam132
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}]))
+}
+