factor/basis/ui/traverse/traverse.factor

87 lines
2.4 KiB
Factor
Raw Normal View History

2009-04-02 10:09:09 -04:00
! Copyright (C) 2007, 2009 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays combinators fry generic io kernel locals
make math namespaces sequences sets ui.gadgets ;
2007-09-20 18:09:08 -04:00
IN: ui.traverse
TUPLE: node value children ;
: traverse-step ( path gadget -- path' gadget' )
[ unclip-slice ] dip children>> ?nth ;
2007-09-20 18:09:08 -04:00
: make-node ( value quot -- node ) { } make node boa ; inline
2007-09-20 18:09:08 -04:00
:: traverse-to-path ( topath gadget -- )
gadget [
topath empty? [
2007-09-20 18:09:08 -04:00
[
gadget children>> topath first head-slice %
topath gadget traverse-step traverse-to-path
2007-09-20 18:09:08 -04:00
] make-node
] unless ,
] when* ;
:: traverse-from-path ( frompath gadget -- )
gadget [
frompath empty? [
2007-09-20 18:09:08 -04:00
[
frompath gadget traverse-step traverse-from-path
gadget children>> frompath first 1 + tail-slice %
2007-09-20 18:09:08 -04:00
] make-node
] unless ,
] when* ;
2007-09-20 18:09:08 -04:00
: traverse-pre ( frompath gadget -- )
traverse-step traverse-from-path ;
: traverse-post ( topath gadget -- )
traverse-step traverse-to-path ;
:: traverse-middle ( frompath topath gadget -- )
gadget [
frompath gadget traverse-pre
frompath first 1 + topath first gadget children>> <slice> %
topath gadget traverse-post
] make-node , ;
2007-09-20 18:09:08 -04:00
DEFER: gadget-subtree%
2007-09-20 18:09:08 -04:00
:: traverse-child ( frompath topath gadget -- )
gadget [
frompath rest-slice
topath gadget traverse-step
gadget-subtree%
] make-node , ;
2007-09-20 18:09:08 -04:00
: gadget-subtree% ( frompath topath gadget -- )
2007-09-20 18:09:08 -04:00
{
{ [ dup not ] [ 3drop ] }
{ [ pick empty? pick empty? and ] [ 2nip , ] }
{ [ pick empty? ] [ traverse-to-path drop ] }
2007-09-20 18:09:08 -04:00
{ [ over empty? ] [ nip traverse-from-path ] }
{ [ pick first pick first = ] [ traverse-child ] }
2008-04-11 13:54:33 -04:00
[ traverse-middle ]
2007-09-20 18:09:08 -04:00
} cond ;
: gadget-subtree ( frompath topath gadget -- seq )
[ gadget-subtree% ] { } make ;
2007-09-20 18:09:08 -04:00
M: node gadget-text*
[ children>> ] [ value>> ] bi gadget-seq-text ;
2007-09-20 18:09:08 -04:00
: gadget-text-range ( frompath topath gadget -- str )
gadget-subtree gadget-text ;
: gadget-at-path ( parent path -- gadget )
[ swap nth-gadget ] each ;
2009-04-02 10:09:09 -04:00
GENERIC#: leaves* 1 ( tree set -- )
2009-04-02 10:09:09 -04:00
M: node leaves* [ children>> ] dip leaves* ;
M: array leaves* '[ _ leaves* ] each ;
M: gadget leaves* adjoin ;
2009-04-02 10:09:09 -04:00
: leaves ( tree -- set ) HS{ } clone [ leaves* ] keep ;