2008-03-15 07:22:47 -04:00
|
|
|
USING: arrays assocs kernel vectors sequences namespaces
|
2008-07-12 16:49:14 -04:00
|
|
|
random math.parser math fry ;
|
2008-01-10 21:49:42 -05:00
|
|
|
|
2008-07-12 16:49:14 -04:00
|
|
|
IN: assocs.lib
|
2008-01-10 21:49:42 -05:00
|
|
|
|
2008-01-18 00:51:03 -05:00
|
|
|
: set-assoc-stack ( value key seq -- )
|
2008-01-28 00:30:24 -05:00
|
|
|
dupd [ key? ] with find-last nip set-at ;
|
2008-01-10 21:49:42 -05:00
|
|
|
|
|
|
|
: at-default ( key assoc -- value/key )
|
|
|
|
dupd at [ nip ] when* ;
|
2008-01-16 16:25:29 -05:00
|
|
|
|
2008-02-25 15:53:18 -05:00
|
|
|
: replace-at ( assoc value key -- assoc )
|
2008-11-29 13:18:28 -05:00
|
|
|
[ dupd 1vector ] dip rot set-at ;
|
2008-02-25 15:53:18 -05:00
|
|
|
|
|
|
|
: peek-at* ( assoc key -- obj ? )
|
2008-11-29 13:18:28 -05:00
|
|
|
swap at* dup [ [ peek ] dip ] when ;
|
2008-02-02 00:47:37 -05:00
|
|
|
|
2008-02-25 15:53:18 -05:00
|
|
|
: peek-at ( assoc key -- obj )
|
2008-02-02 00:47:37 -05:00
|
|
|
peek-at* drop ;
|
|
|
|
|
|
|
|
: >multi-assoc ( assoc -- new-assoc )
|
|
|
|
[ 1vector ] assoc-map ;
|
|
|
|
|
|
|
|
: multi-assoc-each ( assoc quot -- )
|
|
|
|
[ with each ] curry assoc-each ; inline
|
|
|
|
|
2008-06-13 03:09:16 -04:00
|
|
|
: insert ( value variable -- ) namespace push-at ;
|
2008-03-14 13:56:36 -04:00
|
|
|
|
2008-03-15 07:22:47 -04:00
|
|
|
: generate-key ( assoc -- str )
|
2008-11-29 13:18:28 -05:00
|
|
|
[ 32 random-bits >hex ] dip
|
2008-03-15 07:22:47 -04:00
|
|
|
2dup key? [ nip generate-key ] [ drop ] if ;
|
|
|
|
|
|
|
|
: set-at-unique ( value assoc -- key )
|
|
|
|
dup generate-key [ swap set-at ] keep ;
|
2008-05-28 18:51:02 -04:00
|
|
|
|
|
|
|
: histogram ( assoc quot -- assoc' )
|
|
|
|
H{ } clone [
|
|
|
|
swap [ change-at ] 2curry assoc-each
|
2008-06-18 04:53:16 -04:00
|
|
|
] keep ; inline
|
2008-08-17 13:01:04 -04:00
|
|
|
|
2008-08-17 22:54:10 -04:00
|
|
|
: ?at ( obj assoc -- value/obj ? )
|
|
|
|
dupd at* [ [ nip ] [ drop ] if ] keep ;
|
2008-08-17 22:27:35 -04:00
|
|
|
|
2008-08-17 13:01:04 -04:00
|
|
|
: if-at ( obj assoc quot1 quot2 -- )
|
2008-08-17 22:54:10 -04:00
|
|
|
[ ?at ] 2dip if ; inline
|
2008-08-17 13:01:04 -04:00
|
|
|
|
|
|
|
: when-at ( obj assoc quot -- ) [ ] if-at ; inline
|
|
|
|
|
|
|
|
: unless-at ( obj assoc quot -- ) [ ] swap if-at ; inline
|