diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map.gleam | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/map.gleam b/src/map.gleam new file mode 100644 index 0000000..0e41aa7 --- /dev/null +++ b/src/map.gleam @@ -0,0 +1,96 @@ +import any +import expect + +pub external type Map(key, value); + +pub external fn new() -> Map(key, value)) + = 'maps' 'new' + +test new { + new() + |> size + |> expect:equal(_, 0) +} + +pub external fn size(Map(_, _)) -> Int + = 'maps' 'size' + +test size { + [] + |> from_list + |> size + |> expect:equal(_, 0) + + [{1, 1}] + |> from_list + |> size + |> expect:equal(_, 1) + + [{"", 1.0}, {"", 2.0}] + |> from_list + |> size + |> expect:equal(_, 2) +} + +external fn is_key(key, Map(key, _)) -> Bool + = 'maps' 'is_key' + +pub fn has_key(map, key) { + is_key(key, map) +} + +test has_key { + [] + |> from_list + |> has_key(_, 1) + |> expect:false + + [{1, 0}] + |> from_list + |> has_key(_, 1) + |> expect:true + + [{4, 0}, {1, 0}] + |> from_list + |> has_key(_, 1) + |> expect:true + + [{4, 0}, {1, 0}] + |> from_list + |> has_key(_, 0) + |> expect:false +} + +pub fn from_record(record: {r}) -> Map(Atom, any:Any) { + any:unsafeCoerce(record) +} + +test from_record { + map = from_record({ name = "Jane" }) + + map + |> size + |> expect:equal(_, 1) + + map + |> expect:equal(_, from_list([{'name', "Jane"}])) +} + +pub external fn to_list(Map(key, value)) -> List(Tuple(key, value)) + = 'maps' 'to_list' + +pub external fn from_list(List(Tuple(key, value))) -> Map(key, value) + = 'maps' 'from_list' + +test from_list { + proplist = [{4, 0}, {1, 0}] + map = from_list(proplist) + + map + |> size + |> expect:equal(_, 2) + + map + |> to_list + |> expect:equal(_, proplist) +} |