2008-12-12 00:11:04 -05:00
|
|
|
! Copyright (C) 2007, 2008 Daniel Ehrenberg, Doug Coleman.
|
2007-12-24 13:20:52 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-12-12 00:11:04 -05:00
|
|
|
USING: sequences kernel strings math fry ;
|
2007-12-24 13:20:52 -05:00
|
|
|
IN: sequences.deep
|
|
|
|
|
|
|
|
! All traversal goes in postorder
|
|
|
|
|
2008-07-27 23:45:46 -04:00
|
|
|
GENERIC: branch? ( object -- ? )
|
|
|
|
|
|
|
|
M: sequence branch? drop t ;
|
|
|
|
M: integer branch? drop f ;
|
|
|
|
M: string branch? drop f ;
|
|
|
|
M: object branch? drop f ;
|
2007-12-24 13:20:52 -05:00
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: deep-each ( ... obj quot: ( ... elt -- ... ) -- ... )
|
2007-12-24 13:20:52 -05:00
|
|
|
[ call ] 2keep over branch?
|
2008-12-22 06:41:01 -05:00
|
|
|
[ '[ _ deep-each ] each ] [ 2drop ] if ; inline recursive
|
2007-12-24 13:20:52 -05:00
|
|
|
|
2015-06-09 11:42:54 -04:00
|
|
|
: deep-reduce ( ... obj identity quot: ( ... prev elt -- ... next ) -- ... result )
|
|
|
|
swapd deep-each ; inline
|
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: deep-map ( ... obj quot: ( ... elt -- ... elt' ) -- ... newobj )
|
2007-12-24 13:20:52 -05:00
|
|
|
[ call ] keep over branch?
|
2008-12-22 06:41:01 -05:00
|
|
|
[ '[ _ deep-map ] map ] [ drop ] if ; inline recursive
|
2007-12-24 13:20:52 -05:00
|
|
|
|
2012-07-11 17:18:11 -04:00
|
|
|
: deep-filter-as ( ... obj quot: ( ... elt -- ... ? ) exemplar -- ... seq )
|
|
|
|
[ selector [ deep-each ] dip ] dip [ like ] when* ; inline recursive
|
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: deep-filter ( ... obj quot: ( ... elt -- ... ? ) -- ... seq )
|
2012-07-11 17:18:11 -04:00
|
|
|
over dup branch? [ drop f ] unless deep-filter-as ; inline
|
2007-12-24 13:20:52 -05:00
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: (deep-find) ( ... obj quot: ( ... elt -- ... ? ) -- ... elt ? )
|
2007-12-24 13:20:52 -05:00
|
|
|
[ call ] 2keep rot [ drop t ] [
|
|
|
|
over branch? [
|
2011-10-16 16:15:05 -04:00
|
|
|
[ f ] 2dip '[ nip _ (deep-find) ] any?
|
2012-07-11 17:18:11 -04:00
|
|
|
] [ 2drop f f ] if
|
2008-07-18 20:22:59 -04:00
|
|
|
] if ; inline recursive
|
2007-12-24 13:20:52 -05:00
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: deep-find ( ... obj quot: ( ... elt -- ... ? ) -- ... elt ) (deep-find) drop ; inline
|
2007-12-24 13:20:52 -05:00
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: deep-any? ( ... obj quot: ( ... elt -- ... ? ) -- ... ? ) (deep-find) nip ; inline
|
2007-12-24 13:20:52 -05:00
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: deep-all? ( ... obj quot: ( ... elt -- ... ? ) -- ... ? )
|
2009-01-29 23:19:07 -05:00
|
|
|
'[ @ not ] deep-any? not ; inline
|
2008-02-26 03:07:11 -05:00
|
|
|
|
2008-12-12 00:11:04 -05:00
|
|
|
: deep-member? ( obj seq -- ? )
|
|
|
|
swap '[
|
|
|
|
_ swap dup branch? [ member? ] [ 2drop f ] if
|
|
|
|
] deep-find >boolean ;
|
|
|
|
|
|
|
|
: deep-subseq? ( subseq seq -- ? )
|
|
|
|
swap '[
|
|
|
|
_ swap dup branch? [ subseq? ] [ 2drop f ] if
|
|
|
|
] deep-find >boolean ;
|
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: deep-map! ( ... obj quot: ( ... elt -- ... elt' ) -- ... obj )
|
2008-11-23 18:41:11 -05:00
|
|
|
over branch? [
|
2009-10-27 23:32:56 -04:00
|
|
|
'[ _ [ call ] keep over [ deep-map! drop ] dip ] map!
|
|
|
|
] [ drop ] if ; inline recursive
|
2007-12-24 13:20:52 -05:00
|
|
|
|
|
|
|
: flatten ( obj -- seq )
|
2008-04-26 00:17:08 -04:00
|
|
|
[ branch? not ] deep-filter ;
|
2012-07-11 17:18:11 -04:00
|
|
|
|
|
|
|
: flatten-as ( obj exemplar -- seq )
|
|
|
|
[ branch? not ] swap deep-filter-as ;
|