mirror of
https://github.com/zaphar/ucg.git
synced 2025-07-21 18:10:42 -04:00
DEV: string lib ergonomic improvements
This commit is contained in:
parent
2155bc0308
commit
b8a063fdb8
@ -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};
|
@ -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,
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user