! Based on Clojure's PersistentHashMap by Rich Hickey.
USING: kernel math accessors assocs fry combinators parser
-prettyprint.backend namespaces
+prettyprint.custom make
persistent.assocs
persistent.hashtables.nodes
persistent.hashtables.nodes.empty
{
{ [ 2dup root>> eq? ] [ nip ] }
{ [ over not ] [ 2drop T{ persistent-hash } ] }
- [ count>> 1- persistent-hash boa ]
+ [ count>> 1 - persistent-hash boa ]
} cond ;
M: persistent-hash >alist [ root>> >alist% ] { } make ;
: >persistent-hash ( assoc -- phash )
T{ persistent-hash } swap [ spin new-at ] assoc-each ;
-: PH{ \ } [ >persistent-hash ] parse-literal ; parsing
+M: persistent-hash equal?
+ over persistent-hash? [ assoc= ] [ 2drop f ] if ;
-M: persistent-hash pprint-delims drop \ PH{ \ } ;
+M: persistent-hash hashcode* nip assoc-size ;
+
+M: persistent-hash clone ;
+
+SYNTAX: PH{ \ } [ >persistent-hash ] parse-literal ;
+M: persistent-hash pprint-delims drop \ PH{ \ } ;
M: persistent-hash >pprint-sequence >alist ;
+M: persistent-hash pprint* pprint-object ;
+
+: passociate ( value key -- phash )
+ T{ persistent-hash } new-at ; inline