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_at=split_at,
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 chars = reduce(func(acc, char) => acc + [char], [], mod.str);
@ -91,35 +92,36 @@ let ops = module {
);
let parse_int = module{
str = mod.str,
start = 0,
end = len,
chars = [],
acc = "",
} => (f.maybe{val=result}) {
let pkg = mod.pkg();
let this = mod.this;
let f = import "std/functional.ucg";
let lists = import "std/lists.ucg";
let reducer = func(acc, char) => acc{
str = select (char, acc.str) => {
"1" = acc.str + char,
"2" = acc.str + char,
"3" = acc.str + char,
"4" = acc.str + char,
"5" = acc.str + char,
"6" = acc.str + char,
"7" = acc.str + char,
"8" = acc.str + char,
"9" = acc.str + char,
"0" = acc.str + char,
let is_int = func(c) => select (c, false) => {
"0" = true,
"1" = true,
"2" = true,
"3" = true,
"4" = true,
"5" = true,
"6" = true,
"7" = true,
"8" = true,
"9" = true,
};
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{
str = mod.str,
start = 0,
@ -135,4 +137,6 @@ let ops = module {
let result = pkg.ops{str=reduce(
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 t = import "std/testing.ucg";
let str_class = strings.ops{str="foo bar"};
let str_class = strings.wrap("foo bar");
assert t.equal{
left = str_class.split_on{},
@ -9,17 +9,17 @@ assert t.equal{
};
assert t.equal{
left = strings.ops{str="foo"}.split_on{},
left = strings.wrap("foo").split_on{},
right = ["foo"],
};
assert t.equal{
left = strings.ops{str=""}.split_on{},
left = strings.wrap("").split_on{},
right = [""],
};
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"],
};
@ -54,12 +54,12 @@ assert t.equal{
};
assert t.equal{
left = strings.ops{str="123"}.parse_int{}.unwrap(),
left = strings.wrap("123").parse_int().unwrap(),
right = 123,
};
let str_int = strings.ops{str="123"};
let str_int = strings.wrap("123");
assert t.equal{
left = strings.ops{str="123 "}.parse_int{}.unwrap(),
left = strings.wrap("123 ").parse_int().unwrap(),
right = 123,
};