mirror of
https://github.com/zaphar/ucg.git
synced 2025-07-23 18:29:50 -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_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};
|
@ -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,
|
||||||
};
|
};
|
Loading…
x
Reference in New Issue
Block a user