: last? ( ... seq quot: ( ... elt -- ... ? ) -- ... ? ) [ last ] dip call ; inline
: nth? ( ... n seq quot: ( ... elt -- ... ? ) -- ... ? ) [ nth ] dip call ; inline
-: loop>sequence ( quot: ( ..a -- ..a obj/f ) exemplar -- seq )
- [ '[ [ @ [ [ , ] when* ] keep ] loop ] ] dip make ; inline
+: loop>sequence** ( ... quot: ( ... -- ... obj ? ) exemplar -- ... seq )
+ [ ] swap produce-as nip ; inline
-: loop>array ( quot: ( ..a -- ..a obj/f ) -- array )
- { } loop>sequence ; inline
+: loop>array** ( ... quot: ( ... -- ... obj ? ) -- ... array )
+ { } loop>sequence** ; inline
-: loop>sequence* ( quot: ( ..a -- ..a obj ? ) exemplar -- seq )
+: loop>sequence* ( ... quot: ( ... -- ... obj ? ) exemplar -- ... seq )
[ '[ [ @ [ [ , ] when* ] [ ] bi* ] loop ] ] dip make ; inline
-: loop>array* ( quot: ( ..a -- ..a obj ? ) -- array )
- { } loop>sequence* ; inline
+: loop>array* ( ... quot: ( ... -- ... obj ? ) -- ... array )
+ { } loop>sequence* ; inline
-: loop>sequence** ( quot: ( ..a -- ..a obj ? ) exemplar -- seq )
- [
- '[
- [
- @
- [ [ , ] [ drop ] if ]
- [ nip ] 2bi
- ] loop
- ]
- ] dip make ; inline
-
-: loop>array** ( quot: ( ..a -- ..a obj ? ) -- array )
- { } loop>sequence** ; inline
+: loop>sequence ( ... quot: ( ... -- ... obj/f ) exemplar -- ... seq )
+ [ [ dup ] compose ] dip loop>sequence** ; inline
+
+: loop>array ( ... quot: ( ... -- ... obj/f ) -- ... array )
+ { } loop>sequence ; inline
: with-pre-incrementer ( quot: ( ..a n -- ..a obj/f ) seq -- quot: ( ..a n -- ..a obj/f ) )
[ -1 ] 2dip