mirror of
https://github.com/zaphar/ucg.git
synced 2025-07-21 18:10:42 -04:00
FEATURE: The beginnings of a standard library for strings.
This commit is contained in:
parent
dd373b6680
commit
87e5db7dbf
38
std/strings.ucg
Normal file
38
std/strings.ucg
Normal 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
|
||||
)
|
||||
);
|
||||
};
|
24
std/tests/strings_test.ucg
Normal file
24
std/tests/strings_test.ucg
Normal 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"},
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user