USING: accessors kernel math sequences serialize ; IN: critbit TUPLE: critbit root ; >root ; inline PRIVATE> : ( -- critbit ) critbit new-critbit ; >byte# swap >>bits ; inline : ( byte# bits -- node ) node new-node ; PRIVATE> : empty? ( tree -- ? ) root>> f = ; inline ! : walk-crit ( obj node -- ? ) ! ; : direction ( byte bits -- direction ) bitor 1 + -8 shift ; > ] [ bits>> ] bi [ 2dup swap length < [ swap nth ] [ 2drop 0 ] if ] dip direction 0 = [ left>> ] [ right>> ] if ; : walk-critbit ( bytes obj -- bytes obj ) [ dup node? ] [ successor ] while ; PRIVATE> : member? ( obj tree -- ? ) dup critbit? [ [ object>bytes ] [ root>> ] bi* walk-critbit = ] [ 2drop f ] if ; : find-byte ( newbytes oldbytes -- x ) 2dup [ bitxor dup 0 = ] 2all? [ [ length ] dip nth ] [ ] if; : put ( obj tree -- tree ) dup critbit? [ dup empty? [ swap object>bytes >>root ] [ [ object>bytes ] [ root>> ] bi* walk-critbit ] if ] [ 2drop "Not a critbit tree" throw ] if ;