[ keys ] [ [ [ ] concat-as ] [ ] map-as ] bi dup length dup '[
[ [ first ] bi@ _ 2cleave ] 2keep
[ @ _ [ cleave-curry ] [ cleave-curry ] bi _ spread* ]
- 1 2each-from
+ 1 -roll 2each-from
] ;
: smart-loop ( ..a quot: ( ..a -- ..b ? ) -- ..b )
: at+ ( n key assoc -- ) [ 0 or + ] change-at ; inline
+: at+* ( n key assoc -- old ) [ 0 or [ + ] keep swap ] change-at ; inline
+
: inc-at ( key assoc -- ) [ 1 ] 2dip at+ ; inline
: of+ ( assoc key n -- assoc ) '[ 0 or _ + ] change-of ; inline
: inc-of ( assoc key -- assoc ) 1 of+ ; inline
+: inc-at* ( key assoc -- old ) [ 1 ] 2dip at+* ; inline
+
: map>assoc ( ... seq quot: ( ... elt -- ... key value ) exemplar -- ... assoc )
dup sequence? [
[ [ 2array ] compose ] dip map-as
: 2each ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... ) -- ... )
2length-operator each-integer ; inline
-: 2each-from ( ... seq1 seq2 quot: ( ... elt1 elt2 -- ... ) i -- ... )
- [ 2length-operator ] dip -rot each-integer-from ; inline
+: 2each-from ( ... from seq1 seq2 quot: ( ... elt1 elt2 -- ... ) -- ... )
+ 2length-operator each-integer-from ; inline
: 2reduce ( ... seq1 seq2 identity quot: ( ... prev elt1 elt2 -- ... next ) -- ... result )
-rotd 2each ; inline