: from-end ( seq n -- seq n' ) [ dup length ] dip - ; inline
+: (1sequence) ( obj seq -- seq )
+ [ 0 swap set-nth-unsafe ] keep ; inline
+
: (2sequence) ( obj1 obj2 seq -- seq )
[ 1 swap set-nth-unsafe ] keep
- [ 0 swap set-nth-unsafe ] keep ; inline
+ (1sequence) ; inline
: (3sequence) ( obj1 obj2 obj3 seq -- seq )
[ 2 swap set-nth-unsafe ] keep
PRIVATE>
+: 1sequence ( obj exemplar -- seq )
+ 1 swap [ (1sequence) ] new-like ; inline
+
: 2sequence ( obj1 obj2 exemplar -- seq )
2 swap [ (2sequence) ] new-like ; inline
over map-into ; inline
: accumulate ( seq identity quot -- final newseq )
- swapd [ pick slip ] curry map ; inline
+ swapd [ [ call ] [ 2drop ] 3bi ] curry map ; inline
: 2each ( seq1 seq2 quot -- )
(2each) each-integer ; inline
: accumulator ( quot -- quot' vec )
V{ } clone [ [ push ] curry compose ] keep ; inline
-: produce-as ( pred quot tail exemplar -- seq )
- [ swap accumulator [ swap while ] dip ] dip like ; inline
+: produce-as ( pred quot exemplar -- seq )
+ [ accumulator [ while ] dip ] dip like ; inline
-: produce ( pred quot tail -- seq )
+: produce ( pred quot -- seq )
{ } produce-as ; inline
: follow ( obj quot -- seq )
- [ dup ] swap [ keep ] curry [ ] produce nip ; inline
+ [ dup ] swap [ keep ] curry produce nip ; inline
: prepare-index ( seq quot -- seq n quot )
[ dup length ] dip ; inline
[ but-last-slice ] [ peek ] bi ; inline
: <flat-slice> ( seq -- slice )
- dup slice? [ { } like ] when 0 over length rot <slice> ;
+ dup slice? [ { } like ] when
+ [ drop 0 ] [ length ] [ ] tri <slice> ;
inline
-: trim-head-slice ( seq quot -- slice )
- over [ [ not ] compose find drop ] dip swap
- [ tail-slice ] [ dup length tail-slice ] if* ; inline
+<PRIVATE
+: (trim-head) ( seq quot -- seq n )
+ over [ [ not ] compose find drop ] dip
+ [ length or ] keep swap ; inline
+
+: (trim-tail) ( seq quot -- seq n )
+ over [ [ not ] compose find-last drop ?1+ ] dip
+ swap ; inline
+
+PRIVATE>
+
+: trim-head-slice ( seq quot -- slice )
+ (trim-head) tail-slice ; inline
+
: trim-head ( seq quot -- newseq )
- over [ trim-head-slice ] dip like ; inline
+ (trim-head) tail ; inline
: trim-tail-slice ( seq quot -- slice )
- over [ [ not ] compose find-last drop ] dip swap
- [ 1+ head-slice ] [ 0 head-slice ] if* ; inline
+ (trim-tail) head-slice ; inline
: trim-tail ( seq quot -- newseq )
- over [ trim-tail-slice ] dip like ; inline
+ (trim-tail) head ; inline
: trim-slice ( seq quot -- slice )
[ trim-head-slice ] [ trim-tail-slice ] bi ; inline
: trim ( seq quot -- newseq )
- over [ trim-slice ] dip like ; inline
+ [ trim-slice ] [ drop ] 2bi like ; inline
: sum ( seq -- n ) 0 [ + ] binary-reduce ;
: supremum ( seq -- n ) [ ] [ max ] map-reduce ;
-: sigma ( seq quot -- n ) [ 0 ] 2dip [ rot slip + ] curry each ; inline
+: sigma ( seq quot -- n )
+ [ 0 ] 2dip [ dip + ] curry [ swap ] prepose each ; inline
: count ( seq quot -- n ) [ 1 0 ? ] compose sigma ; inline