diff --git a/std/strings.ucg b/std/strings.ucg new file mode 100644 index 0000000..3147107 --- /dev/null +++ b/std/strings.ucg @@ -0,0 +1,38 @@ +let ops = module { + str="", +} => { + let split_on = module{ + on=" ", + str=mod.str, + } => { + let splitter = func(acc, char) => acc{ + out = select char == mod.on, acc.out, { + true = acc.out + [acc.buf], + }, + buf = select char != mod.on, "", { + true = acc.buf + char, + }, + }; + + let accumulated = reduce(splitter, {out=[], buf=""}, mod.str); + + let result = accumulated.out + [accumulated.buf]; + }; + + let split_at = func(idx) => filter( + func(name, val) => name != "counter", + reduce( + func(acc, char) => acc{ + counter = acc.counter + 1, + left = select acc.counter < idx, acc.left, { + true = acc.left + char, + }, + right = select acc.counter >= idx, acc.right, { + true = acc.right + char, + }, + }, + {counter = 0, left = "", right = ""}, + mod.str + ) + ); +}; \ No newline at end of file diff --git a/std/tests/strings_test.ucg b/std/tests/strings_test.ucg new file mode 100644 index 0000000..a45c2c1 --- /dev/null +++ b/std/tests/strings_test.ucg @@ -0,0 +1,24 @@ +let strings = import "std/strings.ucg"; +let t = import "std/testing.ucg".asserts{}; + +let str_class = strings.ops{str="foo bar"}; + +assert t.equal{ + left = str_class.split_on{}.result, + right = ["foo", "bar"], +}; + +assert t.equal{ + left = strings.ops{str="foo"}.split_on{}.result, + right = ["foo"], +}; + +assert t.equal{ + left = strings.ops{str=""}.split_on{}.result, + right = [""], +}; + +assert t.equal{ + left = str_class.split_at(3), + right = {left="foo", right=" bar"}, +}; \ No newline at end of file