1 ! Copyright (C) 2007, 2009 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays combinators fry generic io kernel locals
4 make math namespaces sequences sets ui.gadgets ;
7 TUPLE: node value children ;
9 : traverse-step ( path gadget -- path' gadget' )
10 [ unclip-slice ] dip children>> ?nth ;
12 : make-node ( value quot -- node ) { } make node boa ; inline
14 :: traverse-to-path ( topath gadget -- )
18 gadget children>> topath first head-slice %
19 topath gadget traverse-step traverse-to-path
24 :: traverse-from-path ( frompath gadget -- )
28 frompath gadget traverse-step traverse-from-path
29 gadget children>> frompath first 1 + tail-slice %
34 : traverse-pre ( frompath gadget -- )
35 traverse-step traverse-from-path ;
37 : traverse-post ( topath gadget -- )
38 traverse-step traverse-to-path ;
40 :: traverse-middle ( frompath topath gadget -- )
42 frompath gadget traverse-pre
43 frompath first 1 + topath first gadget children>> <slice> %
44 topath gadget traverse-post
47 DEFER: gadget-subtree%
49 :: traverse-child ( frompath topath gadget -- )
52 topath gadget traverse-step
56 : gadget-subtree% ( frompath topath gadget -- )
58 { [ dup not ] [ 3drop ] }
59 { [ pick empty? pick empty? and ] [ 2nip , ] }
60 { [ pick empty? ] [ traverse-to-path drop ] }
61 { [ over empty? ] [ nip traverse-from-path ] }
62 { [ pick first pick first = ] [ traverse-child ] }
66 : gadget-subtree ( frompath topath gadget -- seq )
67 [ gadget-subtree% ] { } make ;
70 [ children>> ] [ value>> ] bi gadget-seq-text ;
72 : gadget-text-range ( frompath topath gadget -- str )
73 gadget-subtree gadget-text ;
75 : gadget-at-path ( parent path -- gadget )
76 [ swap nth-gadget ] each ;
78 GENERIC#: leaves* 1 ( tree set -- )
80 M: node leaves* [ children>> ] dip leaves* ;
82 M: array leaves* '[ _ leaves* ] each ;
84 M: gadget leaves* adjoin ;
86 : leaves ( tree -- set ) HS{ } clone [ leaves* ] keep ;