trees, make pop/slurp work for all trees
It is not as optimized as it could be but it is a simple way to ensure that the tree properties are maintained.char-rename
parent
e0bd21e24a
commit
d800d026de
|
@ -415,34 +415,25 @@ PRIVATE>
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: (pop-tree-extremity) ( tree -- node/f )
|
: pop-tree-extremity ( tree node/f -- node/f )
|
||||||
dup root>> dup node-link
|
dup [
|
||||||
[ (prune-extremity) nip ]
|
[ key>> swap delete-at ] keep node>entry
|
||||||
[ [ delete-node swap root<< ] keep ] if* ;
|
|
||||||
|
|
||||||
: pop-tree-extremity ( tree -- node/f )
|
|
||||||
[ (pop-tree-extremity) ] [ over [ dec-count ] [ drop ] if ] bi
|
|
||||||
node>entry ;
|
|
||||||
|
|
||||||
: slurp-tree ( tree quot: ( ... entry -- ... ) -- ... )
|
|
||||||
[ drop [ count>> 0 = ] curry ]
|
|
||||||
[ [ [ pop-tree-extremity ] curry ] dip compose ] 2bi until ; inline
|
|
||||||
|
|
||||||
: pop-tree ( tree -- entry )
|
|
||||||
dup root>> dup [
|
|
||||||
drop pop-tree-extremity
|
|
||||||
] [ nip ] if ;
|
] [ nip ] if ;
|
||||||
|
|
||||||
|
:: slurp-tree ( tree quot: ( ... entry -- ... ) getter: ( tree -- node ) -- ... )
|
||||||
|
[ tree count>> 0 = ]
|
||||||
|
[ tree getter call quot call ] until ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: pop-tree-left ( tree -- pair/f )
|
: pop-tree-left ( tree -- node/f )
|
||||||
left [ pop-tree ] with-side ;
|
dup first-node pop-tree-extremity ;
|
||||||
|
|
||||||
: pop-tree-right ( tree -- pair/f )
|
: pop-tree-right ( tree -- node/f )
|
||||||
right [ pop-tree ] with-side ;
|
dup last-node pop-tree-extremity ;
|
||||||
|
|
||||||
: slurp-tree-left ( tree quot: ( ... entry -- ... ) -- ... )
|
: slurp-tree-left ( tree quot: ( ... entry -- ... ) -- ... )
|
||||||
left [ slurp-tree ] with-side ; inline
|
[ pop-tree-left ] slurp-tree ; inline
|
||||||
|
|
||||||
: slurp-tree-right ( tree quot: ( ... entry -- ... ) -- ... )
|
: slurp-tree-right ( tree quot: ( ... entry -- ... ) -- ... )
|
||||||
right [ slurp-tree ] with-side ; inline
|
[ pop-tree-right ] slurp-tree ; inline
|
||||||
|
|
Loading…
Reference in New Issue