 
 M: persistent-hash >alist [ root>> >alist% ] { } make ;
 
-M: persistent-hash keys >alist [ first ] map ;
+M: persistent-hash keys >alist keys ;
 
-M: persistent-hash values >alist [ second ] map ;
+M: persistent-hash values >alist values ;
 
-:: >persistent-hash ( assoc -- phash )
-    T{ persistent-hash } assoc [| ph k v | v k ph new-at ] assoc-each ;
+: >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 ;

! 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 ;
IN: persistent.hashtables

TUPLE: persistent-hash
{ 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
    [
        [ 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
