]> gitweb.factorcode.org Git - factor.git/commitdiff
rosetta-code.multisplit: new vocab
authorAlexander Iljin <ajsoft@yandex.ru>
Wed, 1 Apr 2020 20:48:50 +0000 (22:48 +0200)
committerJohn Benediktsson <mrjbq7@gmail.com>
Wed, 1 Apr 2020 23:21:52 +0000 (23:21 +0000)
extra/rosetta-code/multisplit/authors.txt [new file with mode: 0644]
extra/rosetta-code/multisplit/multisplit-tests.factor [new file with mode: 0644]
extra/rosetta-code/multisplit/multisplit.factor [new file with mode: 0644]
extra/rosetta-code/multisplit/tags.txt [new file with mode: 0644]

diff --git a/extra/rosetta-code/multisplit/authors.txt b/extra/rosetta-code/multisplit/authors.txt
new file mode 100644 (file)
index 0000000..8e1955f
--- /dev/null
@@ -0,0 +1 @@
+Alexander Ilin
diff --git a/extra/rosetta-code/multisplit/multisplit-tests.factor b/extra/rosetta-code/multisplit/multisplit-tests.factor
new file mode 100644 (file)
index 0000000..e7094d8
--- /dev/null
@@ -0,0 +1,8 @@
+! Copyright (C) 2020 Alexander Ilin.
+! See http://factorcode.org/license.txt for BSD license.
+USING: sequences strings tools.test rosetta-code.multisplit ;
+IN: rosetta-code.multisplit.tests
+
+{ { "a" "" "b" "" "c" } } [
+    "a!===b=!=c" { "==" "!=" "=" } multisplit [ >string ] map
+] unit-test
diff --git a/extra/rosetta-code/multisplit/multisplit.factor b/extra/rosetta-code/multisplit/multisplit.factor
new file mode 100644 (file)
index 0000000..b082be9
--- /dev/null
@@ -0,0 +1,22 @@
+! Copyright (C) 2020 Alexander Ilin.
+! See http://factorcode.org/license.txt for BSD license.
+USING: arrays fry kernel make sequences ;
+
+IN: rosetta-code.multisplit
+
+: ?pair ( ? x -- {?,x}/f )
+    over [ 2array ] [ 2drop f ] if ;
+
+: best-separator ( seq -- pos index )
+    dup [ first ] map infimum '[ first _ = ] filter first first2 ;
+
+: first-subseq ( separators seq -- n separator )
+    dupd [ swap [ subseq-start ] dip ?pair ] curry map-index sift
+    [ drop f f ] [ best-separator rot nth ] if-empty ;
+
+: multisplit ( string separators -- seq )
+    '[
+        [ _ over first-subseq dup ] [
+            length -rot cut-slice swap , swap tail-slice
+        ] while 2drop ,
+    ] { } make ;
diff --git a/extra/rosetta-code/multisplit/tags.txt b/extra/rosetta-code/multisplit/tags.txt
new file mode 100644 (file)
index 0000000..1e107f5
--- /dev/null
@@ -0,0 +1 @@
+examples