Prelude.splitByAll

This commit is contained in:
2023-06-29 15:38:48 -06:00
parent f68911cf61
commit 1066a4ed76
3 changed files with 38 additions and 1 deletions

View File

@@ -352,6 +352,34 @@ class Prelude {
return zipThrow(l1, l2);
}
private static function _splitByAll(tokens:Array<String>, delimiters:Array<String>, 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<Array<String>> = zipThrow(innerTokens, [for (_ in 0... innerTokens.length) nextDelim]);
var innerTokensWithDelimiterBetween:Array<String> = 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<String>) {
// 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<T>(l:kiss.List<T>):kiss.List<T> {
var c = l.copy();
c.reverse();

View File

@@ -15,6 +15,10 @@ using StringTools;
@:build(kiss.Kiss.build())
class BasicTestCase extends Test {
function testSplitByAll() {
_testSplitByAll();
}
function testStaticVar() {
Assert.equals("Howdy", BasicTestCase.message);
}

View File

@@ -950,4 +950,9 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m
(otherNameForObj?.doThing)
(?.doThing obj)
(?.doThing otherNameForObj))
(Assert.pass))
(Assert.pass))
(function _testSplitByAll []
(Assert.equals
(Std.string ["Thing" "<" "Generic" ">" "->" "Thing"])
(Std.string (Prelude.splitByAll "Thing<Generic>->Thing" [">" "<" "->"]))))