DEV: Add an integer parsing operation for string.

This commit is contained in:
Jeremy Wall 2019-11-24 09:42:04 -05:00
parent 7b28fd9d6c
commit 2155bc0308
2 changed files with 42 additions and 0 deletions

View File

@ -20,6 +20,7 @@ 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,
}) { }) {
let len = import "std/lists.ucg".len(mod.str); let len = import "std/lists.ucg".len(mod.str);
let str = mod.str; let str = mod.str;
@ -89,6 +90,36 @@ let ops = module {
) )
); );
let parse_int = module{
str = mod.str,
start = 0,
end = len,
} => (f.maybe{val=result}) {
let pkg = mod.pkg();
let f = import "std/functional.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 num = reduce(
reducer, {counter = 0, str = ""}, mod.str).str;
let result = select (num != "", NULL) => {
true = int(num),
false = NULL,
};
};
let substr = module{ let substr = module{
str = mod.str, str = mod.str,
start = 0, start = 0,

View File

@ -52,3 +52,14 @@ assert t.equal{
left = str_class.substr{end=8}.str, left = str_class.substr{end=8}.str,
right = "foo bar", right = "foo bar",
}; };
assert t.equal{
left = strings.ops{str="123"}.parse_int{}.unwrap(),
right = 123,
};
let str_int = strings.ops{str="123"};
assert t.equal{
left = strings.ops{str="123 "}.parse_int{}.unwrap(),
right = 123,
};