This leads to more consistent formatting across entire Aiken programs. Before that commit, only long expressions would be formatted on a newline, causing non-consistent formatting and additional reading barrier when looking at source code. Programs also now take more vertical space, which is better for more friendly diffing in version control systems (especially git).
43 lines
798 B
Plaintext
43 lines
798 B
Plaintext
pub opaque type AssocList<key, value> {
|
|
inner: List<(key, value)>,
|
|
}
|
|
|
|
pub fn new() -> AssocList<key, value> {
|
|
AssocList { inner: [] }
|
|
}
|
|
|
|
pub fn to_list(m: AssocList<key, value>) -> List<(key, value)> {
|
|
m.inner
|
|
}
|
|
|
|
pub fn insert(
|
|
in m: AssocList<key, value>,
|
|
key k: key,
|
|
value v: value,
|
|
) -> AssocList<key, value> {
|
|
AssocList { inner: do_insert(m.inner, k, v) }
|
|
}
|
|
|
|
fn do_insert(elems: List<(key, value)>, k: key, v: value) -> List<(key, value)> {
|
|
when elems is {
|
|
[] ->
|
|
[(k, v)]
|
|
[(k2, v2), ..rest] ->
|
|
if k == k2 {
|
|
[(k, v), ..rest]
|
|
} else {
|
|
[(k2, v2), ..do_insert(rest, k, v)]
|
|
}
|
|
}
|
|
}
|
|
|
|
fn fixture_1() {
|
|
new()
|
|
|> insert("foo", 42)
|
|
|> insert("bar", 14)
|
|
}
|
|
|
|
test to_list_2() {
|
|
to_list(fixture_1()) == [("foo", 42), ("bar", 14)]
|
|
}
|