From 9d5c62d6a744b749d40766bc590caef04f6a1d71 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Thu, 21 Jul 2022 01:39:39 -0500 Subject: [PATCH] sequences: rename some helper words and subseq/member variants (each-integer) -> each-integer-from (find-integer) -> find-integer-from (all-integers?) -> all-integers-from? subseq == swap find-subseq add: find-subseq-from subseq-starts-at? --- core/growable/growable.factor | 2 +- core/math/math.factor | 18 +++++----- core/sequences/sequences-docs.factor | 21 +++++++++--- core/sequences/sequences.factor | 49 ++++++++++++++++++---------- core/splitting/splitting.factor | 2 +- core/strings/strings-tests.factor | 2 ++ core/system/system-tests.factor | 3 +- 7 files changed, 64 insertions(+), 33 deletions(-) diff --git a/core/growable/growable.factor b/core/growable/growable.factor index e6daa965a4..f2662ddfe7 100644 --- a/core/growable/growable.factor +++ b/core/growable/growable.factor @@ -35,7 +35,7 @@ GENERIC: contract ( len seq -- ) M: growable contract [ length ] keep [ [ 0 ] 2dip set-nth-unsafe ] curry - (each-integer) ; inline + each-integer-from ; inline M: growable set-length bounds-check-head diff --git a/core/math/math.factor b/core/math/math.factor index de463a3579..c4178b0f09 100644 --- a/core/math/math.factor +++ b/core/math/math.factor @@ -247,43 +247,43 @@ GENERIC: prev-float ( m -- n ) : align ( m w -- n ) 1 - [ + ] keep bitnot bitand ; inline -: (each-integer) ( ... i n quot: ( ... i -- ... ) -- ... ) +: each-integer-from ( ... i n quot: ( ... i -- ... ) -- ... ) 2over < [ [ nip call ] 3keep - [ 1 + ] 2dip (each-integer) + [ 1 + ] 2dip each-integer-from ] [ 3drop ] if ; inline recursive -: (find-integer) ( ... i n quot: ( ... i -- ... ? ) -- ... i/f ) +: find-integer-from ( ... i n quot: ( ... i -- ... ? ) -- ... i/f ) 2over < [ [ nip call ] 3keep roll [ 2drop ] - [ [ 1 + ] 2dip (find-integer) ] if + [ [ 1 + ] 2dip find-integer-from ] if ] [ 3drop f ] if ; inline recursive -: (all-integers?) ( ... i n quot: ( ... i -- ... ? ) -- ... ? ) +: all-integers-from? ( ... i n quot: ( ... i -- ... ? ) -- ... ? ) 2over < [ [ nip call ] 3keep roll - [ [ 1 + ] 2dip (all-integers?) ] + [ [ 1 + ] 2dip all-integers-from? ] [ 3drop f ] if ] [ 3drop t ] if ; inline recursive : each-integer ( ... n quot: ( ... i -- ... ) -- ... ) - [ 0 ] 2dip (each-integer) ; inline + [ 0 ] 2dip each-integer-from ; inline : times ( ... n quot: ( ... -- ... ) -- ... ) [ drop ] prepose each-integer ; inline : find-integer ( ... n quot: ( ... i -- ... ? ) -- ... i/f ) - [ 0 ] 2dip (find-integer) ; inline + [ 0 ] 2dip find-integer-from ; inline : all-integers? ( ... n quot: ( ... i -- ... ? ) -- ... ? ) - [ 0 ] 2dip (all-integers?) ; inline + [ 0 ] 2dip all-integers-from? ; inline : find-last-integer ( ... n quot: ( ... i -- ... ? ) -- ... i/f ) over 0 < [ diff --git a/core/sequences/sequences-docs.factor b/core/sequences/sequences-docs.factor index 2b725c50b4..8c185d586c 100644 --- a/core/sequences/sequences-docs.factor +++ b/core/sequences/sequences-docs.factor @@ -1190,12 +1190,20 @@ HELP: cut* { $values { "seq" sequence } { "n" "a non-negative integer" } { "before" sequence } { "after" sequence } } { $description "Outputs a pair of sequences, where " { $snippet "after" } " consists of the last " { $snippet "n" } " elements of " { $snippet "seq" } ", while " { $snippet "before" } " holds the remaining elements. Both output sequences have the same type as " { $snippet "seq" } "." } ; -HELP: subseq-start-from -{ $values { "subseq" sequence } { "seq" sequence } { "n" "a start index" } { "i" "a start index" } } +HELP: subseq-starts-at? +{ $values { "i" "a start index" } { "seq" sequence } { "subseq" sequence } { "?" boolean } } +{ $description "Outputs " { $snippet "t" } " if the subseq starts at the " { $snippet "i" } "th element or outputs " { $link f } " if the sequence is not at that position." } ; + +HELP: find-subseq +{ $values { "seq" sequence } { "subseq" sequence } { "i/f" "a start index or " { $snippet "f" } } } +{ $description "Outputs the start index of the first contiguous subsequence equal to " { $snippet "subseq" } ", starting the search from the " { $snippet "n" } "th element. If no matching subsequence is found, outputs " { $link f } "." } ; + +HELP: find-subseq-from +{ $values { "n" "a start index" } { "seq" sequence } { "subseq" sequence } { "i/f" "a start index or " { $snippet "f" } } } { $description "Outputs the start index of the first contiguous subsequence equal to " { $snippet "subseq" } ", starting the search from the " { $snippet "n" } "th element. If no matching subsequence is found, outputs " { $link f } "." } ; HELP: subseq-start -{ $values { "subseq" sequence } { "seq" sequence } { "i" "a start index" } } +{ $values { "subseq" sequence } { "seq" sequence } { "i/f" "a start index or " { $snippet "f" } } } { $description "Outputs the start index of the first contiguous subsequence equal to " { $snippet "subseq" } ", or " { $link f } " if no matching subsequence is found." } ; HELP: subseq? @@ -1937,7 +1945,12 @@ ARTICLE: "sequences-search" "Searching sequences" last-index-from } "Finding the start of a subsequence:" -{ $subsections subseq-start subseq-start-from } +{ $subsections + subseq-start + find-subseq + find-subseq-from + subseq-starts-at? +} "Finding the index of an element satisfying a predicate:" { $subsections find diff --git a/core/sequences/sequences.factor b/core/sequences/sequences.factor index 6605e6f88e..1891149396 100644 --- a/core/sequences/sequences.factor +++ b/core/sequences/sequences.factor @@ -473,10 +473,10 @@ PRIVATE> PRIVATE> : each ( ... seq quot: ( ... x -- ... ) -- ... ) - (each) (each-integer) ; inline + (each) each-integer-from ; inline : each-from ( ... seq quot: ( ... x -- ... ) i -- ... ) - (each-from) (each-integer) ; inline + (each-from) each-integer-from ; inline : reduce ( ... seq identity quot: ( ... prev elt -- ... next ) -- ... result ) swapd each ; inline @@ -521,7 +521,7 @@ PRIVATE> (2each) each-integer ; inline : 2each-from ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... ) i -- ... ) - [ (2each) ] dip -rot (each-integer) ; inline + [ (2each) ] dip -rot each-integer-from ; inline : 2reduce ( ... seq1 seq2 identity quot: ( ... prev elt1 elt2 -- ... next ) -- ... result ) -rotd 2each ; inline @@ -548,7 +548,7 @@ PRIVATE> pickd swap 3map-as ; inline : find-from ( ... n seq quot: ( ... elt -- ... ? ) -- ... i elt ) - [ (find-integer) ] (find-from) ; inline + [ find-integer-from ] (find-from) ; inline : find ( ... seq quot: ( ... elt -- ... ? ) -- ... i elt ) [ find-integer ] (find) ; inline @@ -560,13 +560,13 @@ PRIVATE> [ [ 1 - ] dip find-last-integer ] (find) ; inline : find-index-from ( ... n seq quot: ( ... elt i -- ... ? ) -- ... i elt ) - [ (find-integer) ] (find-index-from) ; inline + [ find-integer-from ] (find-index-from) ; inline : find-index ( ... seq quot: ( ... elt i -- ... ? ) -- ... i elt ) [ find-integer ] (find-index) ; inline : all? ( ... seq quot: ( ... elt -- ... ? ) -- ... ? ) - (each) (all-integers?) ; inline + (each) all-integers-from? ; inline : push-if ( ..a elt quot: ( ..a elt -- ..b ? ) accum -- ..b ) [ keep ] dip rot [ push ] [ 2drop ] if ; inline @@ -681,15 +681,27 @@ PRIVATE> : member? ( elt seq -- ? ) [ = ] with any? ; +: member-of? ( seq elt -- ? ) + [ = ] curry any? ; + : member-eq? ( elt seq -- ? ) [ eq? ] with any? ; +: member-eq-of? ( seq elt -- ? ) + [ eq? ] curry any? ; + : remove ( elt seq -- newseq ) [ = ] with reject ; +: remove-of ( seq elt -- newseq ) + [ = ] curry reject ; + : remove-eq ( elt seq -- newseq ) [ eq? ] with reject ; +: remove-eq-of ( seq elt -- newseq ) + [ eq? ] curry reject ; + : sift ( seq -- newseq ) [ ] filter ; @@ -1017,22 +1029,25 @@ PRIVATE> : cut* ( seq n -- before after ) [ head* ] [ tail* ] 2bi ; - +: subseq-start-from ( subseq seq n -- i/f ) spin find-subseq-from ; inline + +: find-subseq ( seq subseq -- i/f ) [ 0 ] 2dip find-subseq-from ; inline -: subseq-start-from ( subseq seq n -- i ) - pick length [ pick length swap - 1 + ] keep - [ (subseq-start-from) ] curry (find-integer) 2nip ; +: find-subseq? ( seq subseq -- ? ) find-subseq >boolean ; inline -: subseq-start ( subseq seq -- i ) 0 subseq-start-from ; inline +: subseq-start ( subseq seq -- i/f ) swap find-subseq ; inline -: subseq? ( subseq seq -- ? ) subseq-start >boolean ; +: subseq? ( subseq seq -- ? ) subseq-start >boolean ; inline : drop-prefix ( seq1 seq2 -- slice1 slice2 ) 2dup mismatch [ 2dup min-length ] unless* diff --git a/core/splitting/splitting.factor b/core/splitting/splitting.factor index 588e731a90..b72aae53bd 100644 --- a/core/splitting/splitting.factor +++ b/core/splitting/splitting.factor @@ -28,7 +28,7 @@ PRIVATE>