1 ! Copyright (c) 2005 Mackenzie Straight.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays kernel math namespaces sequences assocs parser
4 trees generic math.order accessors prettyprint.custom shuffle ;
12 : rotate-right ( node -- node )
14 [ right>> swap (>>left) ] 2keep
17 : rotate-left ( node -- node )
19 [ left>> swap (>>right) ] 2keep
22 : link-right ( left right key node -- left right key node )
23 swap [ [ swap (>>left) ] 2keep
24 nip dup left>> ] dip swap ;
26 : link-left ( left right key node -- left right key node )
27 swap [ rot [ (>>right) ] 2keep
28 drop dup right>> swapd ] dip swap ;
30 : cmp ( key node -- obj node -1/0/1 )
33 : lcmp ( key node -- obj node -1/0/1 )
34 2dup left>> key>> key-side ;
36 : rcmp ( key node -- obj node -1/0/1 )
37 2dup right>> key>> key-side ;
41 : splay-left ( left right key node -- left right key node )
43 lcmp 0 < [ rotate-right ] when
44 dup left>> [ link-right (splay) ] when
47 : splay-right ( left right key node -- left right key node )
49 rcmp 0 > [ rotate-left ] when
50 dup right>> [ link-left (splay) ] when
53 : (splay) ( left right key node -- left right key node )
55 [ drop splay-left ] [ 0 > [ splay-right ] when ] if ;
57 : assemble ( head left right node -- root )
58 [ right>> swap (>>left) ] keep
59 [ left>> swap (>>right) ] keep
60 [ swap left>> swap (>>right) ] 2keep
61 [ swap right>> swap (>>left) ] keep ;
63 : splay-at ( key node -- node )
64 [ T{ node } clone dup dup ] 2dip
65 (splay) nip assemble ;
67 : splay ( key tree -- )
68 [ root>> splay-at ] keep (>>root) ;
70 : splay-split ( key tree -- node node )
71 2dup splay root>> cmp 0 < [
72 nip dup left>> swap f over (>>left)
74 nip dup right>> swap f over (>>right) swap
77 : get-splay ( key tree -- node ? )
78 2dup splay root>> cmp 0 = [
84 : get-largest ( node -- node )
85 dup [ dup right>> [ nip get-largest ] when* ] when ;
87 : splay-largest ( node -- node )
88 dup [ dup get-largest key>> swap splay-at ] when ;
90 : splay-join ( n2 n1 -- node )
97 : remove-splay ( key tree -- )
100 dup right>> swap left>> splay-join
104 : set-splay ( value key tree -- )
105 2dup get-splay [ 2nip (>>value) ] [
108 [ [ swapd ] dip node boa ] dip (>>root)
111 : new-root ( value key tree -- )
113 [ swap <node> ] dip (>>root) ;
115 M: splay set-at ( value key tree -- )
116 dup root>> [ set-splay ] [ new-root ] if ;
118 M: splay at* ( key tree -- value ? )
120 get-splay [ dup [ value>> ] when ] dip
125 M: splay delete-at ( key tree -- )
126 dup root>> [ remove-splay ] [ 2drop ] if ;
131 : >splay ( assoc -- tree )
132 T{ splay f f 0 } assoc-clone-like ;
135 \ } [ >splay ] parse-literal ;
138 drop dup splay? [ >splay ] unless ;
140 M: splay pprint-delims drop \ SPLAY{ \ } ;