aboutsummaryrefslogtreecommitdiff
path: root/src/map.gleam
blob: 0e41aa797affeaf499caeb1b25b6986117bd62c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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)
}