]> gitweb.factorcode.org Git - factor.git/commitdiff
sequences: Add join-as, which takes an exemplar. Move split-subseq and replace from...
authorDoug Coleman <doug.coleman@gmail.com>
Fri, 4 Jan 2013 00:42:34 +0000 (16:42 -0800)
committerDoug Coleman <doug.coleman@gmail.com>
Fri, 4 Jan 2013 00:44:25 +0000 (16:44 -0800)
basis/unicode/case/case.factor
core/sequences/sequences-docs.factor
core/sequences/sequences-tests.factor
core/sequences/sequences.factor
core/splitting/splitting-docs.factor
core/splitting/splitting-tests.factor
core/splitting/splitting.factor

index a08e482c3e817e2b3651a63ef6417da91d496bef..c8ed8b2d0f3caa1acdaaf6d5f8c7ad5398812639 100644 (file)
@@ -11,12 +11,6 @@ SYMBOL: locale ! Just casing locale, or overall?
 
 <PRIVATE
 
-: split-subseq ( string sep -- strings )
-    [ dup ] swap '[ _ split1-slice swap ] produce nip ;
-
-: replace ( str old new -- newstr )
-    [ split-subseq ] dip join ; inline
-
 : i-dot? ( locale -- ? )
     { "tr" "az" } member? ; inline
 
index 4000802a9b31ec6f5b6e496f11b7597b943084d0..18c96831928726b4cb532728bc0fc816c3afee26 100644 (file)
@@ -624,7 +624,13 @@ HELP: join
 { $notes "If the " { $snippet "glue" } " sequence is empty, this word calls " { $link concat-as } "." }
 { $errors "Throws an error if one of the sequences in " { $snippet "seq" } " contains elements not permitted in sequences of the same class as " { $snippet "glue" } "." } ;
 
-{ join concat concat-as } related-words
+HELP: join-as
+{ $values { "seq" sequence } { "glue" sequence } { "exemplar" sequence } { "newseq" sequence } }
+{ $description "Concatenates a sequence of sequences together into one sequence, placing a copy of " { $snippet "glue" } " between each pair of sequences. The resulting sequence is of the same class as " { $snippet "glue" } "." }
+{ $notes "If the " { $snippet "glue" } " sequence is empty, this word calls " { $link concat-as } "." }
+{ $errors "Throws an error if one of the sequences in " { $snippet "seq" } " contains elements not permitted in sequences of the same class as " { $snippet "exemplar" } "." } ;
+
+{ join join-as concat concat-as } related-words
 
 HELP: last
 { $values { "seq" sequence } { "elt" object } }
index 2ad5847cc094739344022d3c43a7d9cf9ac064de..26f75e50f99814cb84042c3cfe884575c92cc811 100644 (file)
@@ -84,11 +84,15 @@ IN: sequences.tests
 [ V{ 3 } ] [ V{ 1 2 3 } clone 2 [ swap < ] curry filter! ] unit-test
 
 [ "hello world how are you" ]
-[ { "hello" "world" "how" "are" "you" } " " join ]
-unit-test
+[ { "hello" "world" "how" "are" "you" } " " join ] unit-test
+
+[ "hello world how are you" ]
+[ { "hello" "world" "how" "are" "you" } " " "" join-as ] unit-test
 
 [ "" ] [ { } "" join ] unit-test
 
+[ "" ] [ { } "" "" join-as ] unit-test
+
 [ { } ] [ { } flip ] unit-test
 
 [ { "b" "e" } ] [ 1 { { "a" "b" "c" } { "d" "e" "f" } } flip nth ] unit-test
index 201bffe111ced8b1e968e907e2f634aafe59aefc..a7db7b63b2f72c96394480908c4015d344ac70a2 100644 (file)
@@ -811,16 +811,19 @@ PRIVATE>
 
 PRIVATE>
 
-: join ( seq glue -- newseq )
-    dup empty? [ concat-as ] [
+: join-as ( seq glue exemplar -- newseq )
+    over empty? [ nip concat-as ] [
         [
             2dup joined-length over new-resizable [
                 [ [ push-all ] 2curry ] [ [ nip push-all ] 2curry ] 2bi
                 interleave
             ] keep
-        ] keep like
+        ] dip like
     ] if ;
 
+: join ( seq glue -- newseq )
+    dup join-as ; inline
+
 : padding ( ... seq n elt quot: ( ... seq1 seq2 -- ... newseq ) -- ... newseq )
     [
         [ over length [-] dup 0 = [ drop ] ] dip
index 824688eefaaeaad940b2572553906e6275f5ea13..c0563b40875aa8656cf37a26b288dcb8ca9404c0 100644 (file)
@@ -19,7 +19,9 @@ ARTICLE: "sequences-split" "Splitting sequences"
     split*-when
 }
 "Splitting a string into lines:"
-{ $subsections string-lines } ;
+{ $subsections string-lines }
+"Replacing subsequences with another subsequence:"
+{ $subsections replace } ;
 
 ABOUT: "sequences-split"
 
@@ -87,3 +89,13 @@ HELP: string-lines
 { $examples
     { $example "USING: prettyprint splitting ;" "\"Hello\\r\\nworld\\n\" string-lines ." "{ \"Hello\" \"world\" \"\" }" }
 } ;
+
+HELP: replace
+{ $values { "seq" sequence } { "old" sequence } { "new" sequence } { "new-seq" sequence } }
+{ $description "Replaces every occurrence of " { $snippet "old" } " with " { $snippet "new" } " in the " { $snippet "seq" } "." }
+{ $examples
+    { $example "USING: io splitting ;"
+               "\"cool example is cool\" \"cool\" \"silly\" replace print"
+               "silly example is silly"
+    }
+} ;
index d03883fb0293172c3c59ce5dedacb2e4d1a734c8..5cda813c7ba09867f4466af1673f40fb4c6c3b84 100644 (file)
@@ -75,3 +75,17 @@ unit-test
 { { { 0 } } } [ { 0 } [ 0 > ] split*-when ] unit-test
 { { { 0 0 } } } [ { 0 0 } [ 0 > ] split*-when ] unit-test
 { { { 1 } { 2 } { 0 3 } { 0 0 } } } [ { 1 2 0 3 0 0 } [ 0 > ] split*-when ] unit-test
+
+{ "abarbbarc" }
+[ "afoobfooc" "foo" "bar" replace ] unit-test
+
+{ "abc" }
+[ "afoobfooc" "foo" "" replace ] unit-test
+
+{ "afoobfooc" }
+[ "afoobfooc" "" "bar" replace ] unit-test
+
+{ "afoobfooc" }
+[ "afoobfooc" "" "" replace ] unit-test
+
+{ "" } [ "" "" "" replace ] unit-test
index 0398cb66d66a9861b2ba43b2805e35b4bc9dafea..65125eed467b552c16fb6d040af38b2d10f5d83b 100644 (file)
@@ -44,6 +44,13 @@ PRIVATE>
 : split1-slice ( seq subseq -- before-slice after-slice )
     [ snip-slice ] (split1) ;
 
+: split-subseq ( seq subseq -- seqs )
+    dup empty? [
+        drop 1array
+    ] [
+        [ dup ] swap [ split1-slice swap ] curry produce nip
+    ] if ;
+
 : split1-when ( ... seq quot: ( ... elt -- ... ? ) -- ... before after )
     dupd find drop [ swap [ dup 1 + ] dip snip ] [ f ] if* ; inline
 
@@ -55,6 +62,9 @@ PRIVATE>
     [ <reversed> ] bi@ split1-slice [ <reversed> ] bi@
     [ f ] [ swap ] if-empty ;
 
+: replace ( seq old new -- new-seq )
+    pick [ [ split-subseq ] dip ] dip join-as ;
+
 <PRIVATE
 
 : (split) ( n seq quot: ( ... elt -- ... ? ) -- )