From 9b143a826de2a4d6b8491ba8b4e5c88b7c1d2fe6 Mon Sep 17 00:00:00 2001 From: Alexander Iljin Date: Wed, 1 Apr 2020 22:48:50 +0200 Subject: [PATCH] rosetta-code.multisplit: new vocab --- extra/rosetta-code/multisplit/authors.txt | 1 + .../multisplit/multisplit-tests.factor | 8 +++++++ .../rosetta-code/multisplit/multisplit.factor | 22 +++++++++++++++++++ extra/rosetta-code/multisplit/tags.txt | 1 + 4 files changed, 32 insertions(+) create mode 100644 extra/rosetta-code/multisplit/authors.txt create mode 100644 extra/rosetta-code/multisplit/multisplit-tests.factor create mode 100644 extra/rosetta-code/multisplit/multisplit.factor create mode 100644 extra/rosetta-code/multisplit/tags.txt diff --git a/extra/rosetta-code/multisplit/authors.txt b/extra/rosetta-code/multisplit/authors.txt new file mode 100644 index 0000000000..8e1955f8e1 --- /dev/null +++ b/extra/rosetta-code/multisplit/authors.txt @@ -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 index 0000000000..e7094d8e9a --- /dev/null +++ b/extra/rosetta-code/multisplit/multisplit-tests.factor @@ -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 index 0000000000..b082be9123 --- /dev/null +++ b/extra/rosetta-code/multisplit/multisplit.factor @@ -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 index 0000000000..1e107f52e4 --- /dev/null +++ b/extra/rosetta-code/multisplit/tags.txt @@ -0,0 +1 @@ +examples