diff --git a/std/strings.ucg b/std/strings.ucg index 1161b63..27eeeea 100644 --- a/std/strings.ucg +++ b/std/strings.ucg @@ -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}; }; -}; \ No newline at end of file +}; + +let wrap = func(str) => ops{str=str}; \ No newline at end of file diff --git a/std/tests/strings_test.ucg b/std/tests/strings_test.ucg index 61e6aad..1f47a9e 100644 --- a/std/tests/strings_test.ucg +++ b/std/tests/strings_test.ucg @@ -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, }; \ No newline at end of file