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
5 trees.private combinators ;
15 : rotate-right ( node -- node )
17 [ right>> swap left<< ] 2keep
20 : rotate-left ( node -- node )
22 [ left>> swap right<< ] 2keep
25 : link-right ( left right key node -- left right key node )
26 swap [ [ swap left<< ] 2keep
27 nip dup left>> ] dip swap ;
29 : link-left ( left right key node -- left right key node )
30 swap [ rot [ right<< ] 2keep
31 drop dup right>> swapd ] dip swap ;
33 : cmp ( key node -- obj node <=> )
36 : lcmp ( key node -- obj node <=> )
37 2dup left>> key>> <=> ;
39 : rcmp ( key node -- obj node <=> )
40 2dup right>> key>> <=> ;
44 : splay-left ( left right key node -- left right key node )
46 lcmp +lt+ = [ rotate-right ] when
47 dup left>> [ link-right (splay) ] when
50 : splay-right ( left right key node -- left right key node )
52 rcmp +gt+ = [ rotate-left ] when
53 dup right>> [ link-left (splay) ] when
56 : (splay) ( left right key node -- left right key node )
58 { +lt+ [ splay-left ] }
59 { +gt+ [ splay-right ] }
63 : assemble ( head left right node -- root )
64 [ right>> swap left<< ] keep
65 [ left>> swap right<< ] keep
66 [ swap left>> swap right<< ] 2keep
67 [ swap right>> swap left<< ] keep ;
69 : splay-at ( key node -- node )
70 [ T{ node } clone dup dup ] 2dip
71 (splay) nip assemble ;
73 : do-splay ( key tree -- )
74 [ root>> splay-at ] keep root<< ;
76 : splay-split ( key tree -- node node )
77 2dup do-splay root>> cmp +lt+ = [
78 nip dup left>> swap f over left<<
80 nip dup right>> swap f over right<< swap
83 : get-splay ( key tree -- node ? )
84 2dup do-splay root>> cmp +eq+ = [
90 : get-largest ( node -- node )
91 dup [ dup right>> [ nip get-largest ] when* ] when ;
93 : splay-largest ( node -- node )
94 dup [ dup get-largest key>> swap splay-at ] when ;
96 : splay-join ( n2 n1 -- node )
103 : remove-splay ( key tree -- )
104 [ get-splay nip ] keep [
106 dup right>> swap left>> splay-join
110 : set-splay ( value key tree -- )
111 2dup get-splay [ 2nip value<< ] [
114 [ [ swapd ] dip node boa ] dip root<<
117 : new-root ( value key tree -- )
119 [ swap <node> ] dip root<< ;
121 M: splay set-at ( value key tree -- )
122 dup root>> [ set-splay ] [ new-root ] if ;
124 M: splay at* ( key tree -- value ? )
126 get-splay [ dup [ value>> ] when ] dip
131 M: splay delete-at ( key tree -- )
132 dup root>> [ remove-splay ] [ 2drop ] if ;
139 : >splay ( assoc -- tree )
140 T{ splay f f 0 } assoc-clone-like ;
143 \ } [ >splay ] parse-literal ;
146 drop dup splay? [ >splay ] unless ;
148 M: splay pprint-delims drop \ SPLAY{ \ } ;