DEV: string lib ergonomic improvements

This commit is contained in:
Jeremy Wall 2019-11-24 09:51:24 -05:00
parent 2155bc0308
commit b8a063fdb8
2 changed files with 36 additions and 32 deletions

View File

@ -20,9 +20,10 @@ let ops = module {
split_on=split_on, split_on=split_on,
split_at=split_at, split_at=split_at,
substr=substr, substr=substr,
parse_int=parse_int, parse_int=parse_int_func,
}) { }) {
let len = import "std/lists.ucg".len(mod.str); let lists = import "std/lists.ucg";
let len = lists.len(mod.str);
let str = mod.str; let str = mod.str;
let chars = reduce(func(acc, char) => acc + [char], [], mod.str); let chars = reduce(func(acc, char) => acc + [char], [], mod.str);
@ -91,35 +92,36 @@ let ops = module {
); );
let parse_int = module{ let parse_int = module{
str = mod.str, chars = [],
start = 0, acc = "",
end = len,
} => (f.maybe{val=result}) { } => (f.maybe{val=result}) {
let pkg = mod.pkg(); let this = mod.this;
let f = import "std/functional.ucg"; let f = import "std/functional.ucg";
let lists = import "std/lists.ucg";
let reducer = func(acc, char) => acc{ let is_int = func(c) => select (c, false) => {
str = select (char, acc.str) => { "0" = true,
"1" = acc.str + char, "1" = true,
"2" = acc.str + char, "2" = true,
"3" = acc.str + char, "3" = true,
"4" = acc.str + char, "4" = true,
"5" = acc.str + char, "5" = true,
"6" = acc.str + char, "6" = true,
"7" = acc.str + char, "7" = true,
"8" = acc.str + char, "8" = true,
"9" = acc.str + char, "9" = true,
"0" = acc.str + char, };
let result = select (lists.len(mod.chars) == 0, mod.acc) => {
false = select (is_int(mod.chars.0), mod.acc) => {
true = this{chars=lists.tail(mod.chars), acc=mod.acc+mod.chars.0}.unwrap(),
}, },
}; };
let num = reduce(
reducer, {counter = 0, str = ""}, mod.str).str;
let result = select (num != "", NULL) => {
true = int(num),
false = NULL,
};
}; };
let parse_int_func = func() => parse_int{chars=chars}.do(func(s) => int(s));
let substr = module{ let substr = module{
str = mod.str, str = mod.str,
start = 0, start = 0,
@ -135,4 +137,6 @@ let ops = module {
let result = pkg.ops{str=reduce( let result = pkg.ops{str=reduce(
reducer, {counter = 0, str = ""}, mod.str).str}; reducer, {counter = 0, str = ""}, mod.str).str};
}; };
}; };
let wrap = func(str) => ops{str=str};

View File

@ -1,7 +1,7 @@
let strings = import "std/strings.ucg"; let strings = import "std/strings.ucg";
let t = import "std/testing.ucg"; let t = import "std/testing.ucg";
let str_class = strings.ops{str="foo bar"}; let str_class = strings.wrap("foo bar");
assert t.equal{ assert t.equal{
left = str_class.split_on{}, left = str_class.split_on{},
@ -9,17 +9,17 @@ assert t.equal{
}; };
assert t.equal{ assert t.equal{
left = strings.ops{str="foo"}.split_on{}, left = strings.wrap("foo").split_on{},
right = ["foo"], right = ["foo"],
}; };
assert t.equal{ assert t.equal{
left = strings.ops{str=""}.split_on{}, left = strings.wrap("").split_on{},
right = [""], right = [""],
}; };
assert t.equal{ assert t.equal{
left = strings.ops{str="foo=>bar=>quux"}.split_on{on="=>"}, left = strings.wrap("foo=>bar=>quux").split_on{on="=>"},
right = ["foo", "bar", "quux"], right = ["foo", "bar", "quux"],
}; };
@ -54,12 +54,12 @@ assert t.equal{
}; };
assert t.equal{ assert t.equal{
left = strings.ops{str="123"}.parse_int{}.unwrap(), left = strings.wrap("123").parse_int().unwrap(),
right = 123, right = 123,
}; };
let str_int = strings.ops{str="123"}; let str_int = strings.wrap("123");
assert t.equal{ assert t.equal{
left = strings.ops{str="123 "}.parse_int{}.unwrap(), left = strings.wrap("123 ").parse_int().unwrap(),
right = 123, right = 123,
}; };