 ! Based on Clojure's PersistentHashMap by Rich Hickey.
 
-USING: kernel math accessors assocs fry combinators parser
-prettyprint.custom locals make sequences
-persistent.assocs
-persistent.hashtables.nodes
-persistent.hashtables.nodes.empty
-persistent.hashtables.nodes.leaf
-persistent.hashtables.nodes.full
-persistent.hashtables.nodes.bitmap
-persistent.hashtables.nodes.collision ;
+USING: accessors assocs combinators kernel make math
+parser persistent.assocs persistent.hashtables.nodes
+prettyprint.custom ;
+
 IN: persistent.hashtables
 
 TUPLE: persistent-hash
-{ root read-only initial: empty-node }
-{ count fixnum read-only } ;
+    { root read-only initial: empty-node }
+    { count fixnum read-only } ;
 
 M: persistent-hash assoc-size count>> ;
 

     [ dup hashcode >fixnum ] [ root>> ] bi* (entry-at)
     dup [ value>> t ] [ f ] if ;

M: persistent-hash new-at ( value key assoc -- assoc' )
    [
        [ 0 ] 3dip
        [ dup hashcode >fixnum ] [ root>> ] bi*
        (new-at) 1 0 ?
    ] [ count>> ] bi +
    persistent-hash boa ;

M: persistent-hash pluck-at
    [ [ dup hashcode >fixnum ] [ root>> ] bi* (pluck-at) ] keep


M: persistent-hash >alist [ root>> >alist% ] { } make ;

M: persistent-hash keys >alist keys ;

M: persistent-hash values >alist values ;

: >persistent-hash ( assoc -- phash )
    T{ persistent-hash } swap [ swap rot new-at ] assoc-each ;

M: persistent-hash equal?
    over persistent-hash? [ assoc= ] [ 2drop f ] if ;
