FEATURE: The beginnings of a standard library for strings.

This commit is contained in:
Jeremy Wall 2019-02-18 20:15:20 -06:00
parent dd373b6680
commit 87e5db7dbf
2 changed files with 62 additions and 0 deletions

38
std/strings.ucg Normal file
View File

@ -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
)
);
};

View File

@ -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"},
};