2010-05-19 16:59:51 -04:00
|
|
|
! (c)2010 Joe Groff bsd license
|
2010-05-24 03:33:41 -04:00
|
|
|
USING: combinators combinators.short-circuit fry generalizations kernel
|
|
|
|
locals macros math quotations sequences compiler.tree.propagation.transforms ;
|
2010-05-19 16:59:51 -04:00
|
|
|
FROM: sequences.private => (each) (each-index) (collect) (2each) ;
|
|
|
|
IN: sequences.unrolled
|
|
|
|
|
|
|
|
<PRIVATE
|
2010-05-24 03:33:41 -04:00
|
|
|
: (unrolled-each-integer) ( quot n -- )
|
|
|
|
swap '[ _ call( i -- ) ] each-integer ;
|
|
|
|
|
|
|
|
<< \ (unrolled-each-integer) [
|
|
|
|
iota [ '[ _ swap call( i -- ) ] ] [ ] map-as '[ _ cleave ]
|
|
|
|
] 1 define-partial-eval >>
|
2010-05-19 16:59:51 -04:00
|
|
|
PRIVATE>
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-each-integer ( n quot: ( i -- ) -- )
|
2010-05-19 16:59:51 -04:00
|
|
|
swap (unrolled-each-integer) ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-collect ( n quot: ( n -- value ) into -- )
|
2010-05-19 16:59:51 -04:00
|
|
|
(collect) unrolled-each-integer ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-map-integers ( n quot: ( n -- value ) exemplar -- newseq )
|
2010-05-19 16:59:51 -04:00
|
|
|
[ over ] dip [ [ unrolled-collect ] keep ] new-like ; inline
|
|
|
|
|
|
|
|
ERROR: unrolled-bounds-error
|
|
|
|
seq unroll-length ;
|
|
|
|
|
|
|
|
ERROR: unrolled-2bounds-error
|
|
|
|
xseq yseq unroll-length ;
|
|
|
|
|
|
|
|
<PRIVATE
|
|
|
|
: unrolled-bounds-check ( seq len quot -- seq len quot )
|
|
|
|
2over swap length > [ 2over unrolled-bounds-error ] when ; inline
|
|
|
|
|
|
|
|
:: unrolled-2bounds-check ( xseq yseq len quot -- xseq yseq len quot )
|
|
|
|
{ [ len xseq length > ] [ len yseq length > ] } 0||
|
|
|
|
[ xseq yseq len unrolled-2bounds-error ]
|
|
|
|
[ xseq yseq len quot ] if ; inline
|
|
|
|
|
|
|
|
: (unrolled-each) ( seq len quot -- len quot )
|
|
|
|
swapd (each) nip ; inline
|
|
|
|
|
|
|
|
: (unrolled-each-index) ( seq len quot -- len quot )
|
|
|
|
swapd (each-index) nip ; inline
|
|
|
|
|
|
|
|
: (unrolled-2each) ( xseq yseq len quot -- len quot )
|
|
|
|
[ '[ _ ] 2dip ] dip (2each) nip ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-each-unsafe ( seq len quot: ( x -- ) -- )
|
2010-05-19 16:59:51 -04:00
|
|
|
(unrolled-each) unrolled-each-integer ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-2each-unsafe ( xseq yseq len quot: ( x y -- ) -- )
|
2010-05-19 16:59:51 -04:00
|
|
|
(unrolled-2each) unrolled-each-integer ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-each-index-unsafe ( seq len quot: ( x -- ) -- )
|
2010-05-19 16:59:51 -04:00
|
|
|
(unrolled-each-index) unrolled-each-integer ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-map-as-unsafe ( seq len quot: ( x -- newx ) exemplar -- newseq )
|
2010-05-19 16:59:51 -04:00
|
|
|
[ (unrolled-each) ] dip unrolled-map-integers ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-2map-as-unsafe ( xseq yseq len quot: ( x y -- newx ) exemplar -- newseq )
|
2010-05-19 16:59:51 -04:00
|
|
|
[ (unrolled-2each) ] dip unrolled-map-integers ; inline
|
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-each ( seq len quot: ( x -- ) -- )
|
2010-05-19 16:59:51 -04:00
|
|
|
unrolled-bounds-check unrolled-each-unsafe ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-2each ( xseq yseq len quot: ( x y -- ) -- )
|
2010-05-19 16:59:51 -04:00
|
|
|
unrolled-2bounds-check unrolled-2each-unsafe ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-each-index ( seq len quot: ( x i -- ) -- )
|
2010-05-19 16:59:51 -04:00
|
|
|
unrolled-bounds-check unrolled-each-index-unsafe ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-map-as ( seq len quot: ( x -- newx ) exemplar -- newseq )
|
2010-05-19 16:59:51 -04:00
|
|
|
[ unrolled-bounds-check ] dip unrolled-map-as-unsafe ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-2map-as ( xseq yseq len quot: ( x y -- newx ) exemplar -- newseq )
|
2010-05-19 16:59:51 -04:00
|
|
|
[ unrolled-2bounds-check ] dip unrolled-2map-as-unsafe ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-map ( seq len quot: ( x -- newx ) -- newseq )
|
2010-05-19 16:59:51 -04:00
|
|
|
pick unrolled-map-as ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-2map ( xseq yseq len quot: ( x y -- newx ) -- newseq )
|
2010-05-19 16:59:51 -04:00
|
|
|
4 npick unrolled-2map-as ; inline
|
|
|
|
|
2010-05-24 03:33:41 -04:00
|
|
|
: unrolled-map-index ( seq len quot: ( x i -- newx ) -- newseq )
|
2010-05-19 16:59:51 -04:00
|
|
|
[ dup length iota ] 2dip unrolled-2map ; inline
|
|
|
|
|