From d2a5a1619a20808210ce51c997238850ef2a14b2 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Wed, 9 Jan 2019 22:33:03 -0600 Subject: [PATCH] STDLIB: More stdlib additions. * list reverse * enumerate for tuples --- std/lists.ucg | 10 ++++++++++ std/tests/lists_test.ucg | 5 +++++ std/tests/tuples_test.ucg | 5 +++++ std/tuples.ucg | 12 ++++++++++++ 4 files changed, 32 insertions(+) diff --git a/std/lists.ucg b/std/lists.ucg index ca2ffd7..9a6a6b8 100644 --- a/std/lists.ucg +++ b/std/lists.ucg @@ -26,6 +26,16 @@ let len = module{ let result = reduce counter.result 0, (mod.list); }; +let reverse = module{ + list = NULL, +} => { + let reducer = macro(acc, item) => { + result = [item] + acc, + }; + + let result = reduce reducer.result [], (mod.list); +}; + let enumerate = module{ start = 0, step = 1, diff --git a/std/tests/lists_test.ucg b/std/tests/lists_test.ucg index 8bd795f..7185937 100644 --- a/std/tests/lists_test.ucg +++ b/std/tests/lists_test.ucg @@ -15,6 +15,11 @@ assert asserts.equal{ right=4, }; +assert asserts.equal{ + left = list.reverse{list=[0, 1, 2, 3]}.result, + right = [3, 2, 1, 0], +}; + assert asserts.equal{ left=list.enumerate{list=["foo", "bar"]}.result, right=[[0, "foo"], [1, "bar"]], diff --git a/std/tests/tuples_test.ucg b/std/tests/tuples_test.ucg index 3138933..028ee6e 100644 --- a/std/tests/tuples_test.ucg +++ b/std/tests/tuples_test.ucg @@ -9,4 +9,9 @@ assert t.asserts{}.equal{ assert t.asserts{}.equal{ left = tpl.values{tpl={foo=1, bar=2}}.result, right = [1, 2], +}; + +assert t.asserts{}.equal{ + left = tpl.enumerate{tpl={foo=1, bar=2}}.result, + right = [["foo", 1], ["bar", 2]], }; \ No newline at end of file diff --git a/std/tuples.ucg b/std/tuples.ucg index 561f2a0..4e16c79 100644 --- a/std/tuples.ucg +++ b/std/tuples.ucg @@ -1,4 +1,5 @@ +// return a list of the fields in a tuple. let fields = module{ tpl = NULL, } => { @@ -9,6 +10,7 @@ let fields = module{ let result = reduce reducer.result [], (mod.tpl); }; +// return a list of the values in a tuple. let values = module{ tpl = NULL, } => { @@ -16,5 +18,15 @@ let values = module{ result = acc + [value], }; + let result = reduce reducer.result [], (mod.tpl); +}; + +let enumerate = module{ + tpl = NULL, +} => { + let reducer = macro(acc, field, value) => { + result = acc + [[field, value]], + }; + let result = reduce reducer.result [], (mod.tpl); }; \ No newline at end of file