From 58c123a930b1cab2b7d692ec0e961833813f036f Mon Sep 17 00:00:00 2001 From: KtorZ Date: Tue, 20 Dec 2022 04:21:28 +0100 Subject: [PATCH] Add new intgration test scenario 029 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` Error: × Main thread panicked. ├─▶ at crates/lang/src/uplc.rs:2395:56 ╰─▶ called `Result::unwrap()` on an `Err` value: FreeUnique(Name { text: "test_insert", unique: Unique(1) }) ``` --- examples/acceptance_tests/029/aiken.toml | 2 + examples/acceptance_tests/029/lib/test.ak | 69 +++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 examples/acceptance_tests/029/aiken.toml create mode 100644 examples/acceptance_tests/029/lib/test.ak diff --git a/examples/acceptance_tests/029/aiken.toml b/examples/acceptance_tests/029/aiken.toml new file mode 100644 index 00000000..aca71889 --- /dev/null +++ b/examples/acceptance_tests/029/aiken.toml @@ -0,0 +1,2 @@ +name = "acceptance_test_029" +version = "0.0.0" diff --git a/examples/acceptance_tests/029/lib/test.ak b/examples/acceptance_tests/029/lib/test.ak new file mode 100644 index 00000000..f1da4f1f --- /dev/null +++ b/examples/acceptance_tests/029/lib/test.ak @@ -0,0 +1,69 @@ +pub opaque type AssocList { + inner: List<#(key, value)>, +} + +pub fn new() -> AssocList { + AssocList { inner: [] } +} + +pub fn from_list(xs: List<#(key, value)>) -> AssocList { + AssocList { inner: do_from_list(xs) } +} + +fn do_from_list(xs: List<#(key, value)>) -> List<#(key, value)> { + when xs is { + [] -> [] + [#(k, v), ..rest] -> do_insert(do_from_list(rest), k, v) + } +} + +pub fn insert( + in m: AssocList, + key k: key, + value v: value, +) -> AssocList { + 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)] + } + } +} + +pub fn union( + left left: AssocList, + right right: AssocList, +) -> AssocList { + AssocList { inner: do_union(left.inner, right.inner) } +} + +fn do_union( + left: List<#(key, value)>, + right: List<#(key, value)>, +) -> List<#(key, value)> { + when left is { + [] -> right + [#(k, v), ..rest] -> do_union(rest, do_insert(right, k, v)) + } +} + +fn fixture_1() { + new() + |> insert("foo", 42) + |> insert("bar", 14) +} + +test union_1() { + union(fixture_1(), new()) == fixture_1() +}