From 1066a4ed767d7ba32cdcb22d3e02439436ba5c65 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Thu, 29 Jun 2023 15:38:48 -0600 Subject: [PATCH] Prelude.splitByAll --- src/kiss/Prelude.hx | 28 ++++++++++++++++++++++++++++ src/test/cases/BasicTestCase.hx | 4 ++++ src/test/cases/BasicTestCase.kiss | 7 ++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/kiss/Prelude.hx b/src/kiss/Prelude.hx index 49b6e02..819c47b 100644 --- a/src/kiss/Prelude.hx +++ b/src/kiss/Prelude.hx @@ -352,6 +352,34 @@ class Prelude { return zipThrow(l1, l2); } + private static function _splitByAll(tokens:Array, delimiters:Array, delimIdx=0) { + if (delimIdx == delimiters.length) return tokens; + + var nextDelim = delimiters[delimIdx]; + tokens = Lambda.flatten([for (token in tokens) { + if (delimiters.indexOf(token) != -1) { + [token]; + } else { + var innerTokens = token.split(nextDelim); + var innerTokensZippedWithDelimiter:Array> = zipThrow(innerTokens, [for (_ in 0... innerTokens.length) nextDelim]); + var innerTokensWithDelimiterBetween:Array = Lambda.flatten(innerTokensZippedWithDelimiter); + innerTokensWithDelimiterBetween.pop(); + innerTokensWithDelimiterBetween; + } + }]); + + return _splitByAll(tokens, delimiters, delimIdx+1); + } + + /* + * Split a string by multiple delimiters and include the delimiters as tokens + */ + public static function splitByAll(s:String, delimiters:Array) { + // Split by longer delimeters first i.e. "->" before ">" when type splitting + var delimiters = sort(delimiters, (a, b) -> b.length - a.length); + return filter(_splitByAll([s], delimiters)); + } + public static function reverse(l:kiss.List):kiss.List { var c = l.copy(); c.reverse(); diff --git a/src/test/cases/BasicTestCase.hx b/src/test/cases/BasicTestCase.hx index b6d7aaa..de37117 100644 --- a/src/test/cases/BasicTestCase.hx +++ b/src/test/cases/BasicTestCase.hx @@ -15,6 +15,10 @@ using StringTools; @:build(kiss.Kiss.build()) class BasicTestCase extends Test { + function testSplitByAll() { + _testSplitByAll(); + } + function testStaticVar() { Assert.equals("Howdy", BasicTestCase.message); } diff --git a/src/test/cases/BasicTestCase.kiss b/src/test/cases/BasicTestCase.kiss index 2bf3208..fc2829a 100644 --- a/src/test/cases/BasicTestCase.kiss +++ b/src/test/cases/BasicTestCase.kiss @@ -950,4 +950,9 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m (otherNameForObj?.doThing) (?.doThing obj) (?.doThing otherNameForObj)) - (Assert.pass)) \ No newline at end of file + (Assert.pass)) + +(function _testSplitByAll [] + (Assert.equals + (Std.string ["Thing" "<" "Generic" ">" "->" "Thing"]) + (Std.string (Prelude.splitByAll "Thing->Thing" [">" "<" "->"])))) \ No newline at end of file