assocs.extras: go nuts on the crazy assoc words.
parent
0b4ec06460
commit
f3934d53c7
|
@ -1,5 +1,4 @@
|
|||
|
||||
USING: assocs.extras kernel sequences tools.test ;
|
||||
USING: assocs.extras kernel math sequences tools.test ;
|
||||
|
||||
{ f } [ f { } deep-at ] unit-test
|
||||
{ f } [ f { "foo" } deep-at ] unit-test
|
||||
|
@ -18,3 +17,41 @@ USING: assocs.extras kernel sequences tools.test ;
|
|||
|
||||
{ H{ } } [ H{ { 1 2 } } 2 over delete-value-at ] unit-test
|
||||
{ H{ { 1 2 } } } [ H{ { 1 2 } } 3 over delete-value-at ] unit-test
|
||||
|
||||
{
|
||||
H{ { 1 3 } { 2 3 } }
|
||||
} [
|
||||
{
|
||||
{ { 1 2 } 3 }
|
||||
} expand-keys-set-at
|
||||
] unit-test
|
||||
|
||||
{
|
||||
H{ { 3 4 } }
|
||||
} [
|
||||
{
|
||||
{ 3 { 1 2 } } { 3 4 }
|
||||
} expand-values-set-at
|
||||
] unit-test
|
||||
|
||||
{
|
||||
H{ { 1 V{ 3 } } { 2 V{ 3 } } }
|
||||
} [
|
||||
{
|
||||
{ { 1 2 } 3 }
|
||||
} expand-keys-push-at
|
||||
] unit-test
|
||||
|
||||
{
|
||||
H{ { 3 V{ 1 2 4 } } }
|
||||
} [
|
||||
{
|
||||
{ 3 { 1 2 } } { 3 4 }
|
||||
} expand-values-push-at
|
||||
] unit-test
|
||||
|
||||
{
|
||||
H{ { 1 [ sq ] } { 2 [ sq ] } }
|
||||
} [
|
||||
{ { { 1 2 { 1 } { 2 } { 1 1 } } [ sq ] } } flatten-keys
|
||||
] unit-test
|
|
@ -1,7 +1,7 @@
|
|||
! Copyright (C) 2012 John Benediktsson, Doug Coleman
|
||||
! See http://factorcode.org/license.txt for BSD license
|
||||
USING: arrays assocs assocs.private generalizations kernel math
|
||||
sequences ;
|
||||
USING: arrays assocs assocs.private fry generalizations kernel
|
||||
math sequences ;
|
||||
IN: assocs.extras
|
||||
|
||||
: deep-at ( assoc seq -- value/f )
|
||||
|
@ -65,6 +65,12 @@ PRIVATE>
|
|||
: sequence>assoc! ( assoc seq map-quot: ( x -- ..y ) insert-quot: ( ..y assoc -- ) -- assoc )
|
||||
4 nrot (sequence>assoc) ; inline
|
||||
|
||||
: assoc>object ( assoc map-quot insert-quot exemplar -- object )
|
||||
clone [ swap curry compose assoc-each ] keep ; inline
|
||||
|
||||
: assoc>object! ( assoc seq map-quot: ( x -- ..y ) insert-quot: ( ..y assoc -- ) -- object )
|
||||
4 nrot assoc>object ; inline
|
||||
|
||||
: sequence>assoc ( seq map-quot insert-quot exemplar -- assoc )
|
||||
clone (sequence>assoc) ; inline
|
||||
|
||||
|
@ -77,3 +83,80 @@ PRIVATE>
|
|||
: sequence>hashtable ( seq map-quot insert-quot -- hashtable )
|
||||
H{ } sequence>assoc ; inline
|
||||
|
||||
: expand-keys-set-at-as ( assoc exemplar -- hashtable' )
|
||||
[
|
||||
[ swap dup sequence? [ 1array ] unless ]
|
||||
[ '[ _ set-at ] with each ]
|
||||
] dip assoc>object ;
|
||||
|
||||
: expand-keys-set-at ( assoc -- hashtable' )
|
||||
H{ } expand-keys-set-at-as ;
|
||||
|
||||
: expand-keys-push-at-as ( assoc exemplar -- hashtable' )
|
||||
[
|
||||
[ swap dup sequence? [ 1array ] unless ]
|
||||
[ '[ _ push-at ] with each ]
|
||||
] dip assoc>object ;
|
||||
|
||||
: expand-keys-push-at ( assoc -- hashtable' )
|
||||
H{ } expand-keys-push-at-as ; inline
|
||||
|
||||
: expand-keys-push-as ( assoc exemplar -- hashtable' )
|
||||
[
|
||||
[ [ dup sequence? [ 1array ] unless ] dip ]
|
||||
[ '[ 2array _ push ] curry each ]
|
||||
] dip assoc>object ;
|
||||
|
||||
: expand-keys-push ( assoc -- hashtable' )
|
||||
V{ } expand-keys-push-as ; inline
|
||||
|
||||
: expand-values-set-at-as ( assoc exemplar -- hashtable' )
|
||||
[
|
||||
[ dup sequence? [ 1array ] unless swap ]
|
||||
[ '[ _ set-at ] curry each ]
|
||||
] dip assoc>object ;
|
||||
|
||||
: expand-values-set-at ( assoc -- hashtable' )
|
||||
H{ } expand-values-set-at-as ; inline
|
||||
|
||||
: expand-values-push-at-as ( assoc exemplar -- hashtable' )
|
||||
[
|
||||
[ dup sequence? [ 1array ] unless swap ]
|
||||
[ '[ _ push-at ] curry each ]
|
||||
] dip assoc>object ;
|
||||
|
||||
: expand-values-push-at ( assoc -- assoc )
|
||||
H{ } expand-values-push-at-as ; inline
|
||||
|
||||
: expand-values-push-as ( assoc exemplar -- assoc )
|
||||
[
|
||||
[ dup sequence? [ 1array ] unless ]
|
||||
[ '[ 2array _ push ] with each ]
|
||||
] dip assoc>object ;
|
||||
|
||||
: expand-values-push ( assoc -- sequence )
|
||||
V{ } expand-values-push-as ; inline
|
||||
|
||||
: assoc-any-key? ( ... assoc quot: ( ... key -- ... ? ) -- ... ? )
|
||||
[ drop ] prepose assoc-find 2nip ; inline
|
||||
|
||||
: assoc-any-value? ( ... assoc quot: ( ... key -- ... ? ) -- ... ? )
|
||||
[ nip ] prepose assoc-find 2nip ; inline
|
||||
|
||||
: assoc-all-key? ( ... assoc quot: ( ... key -- ... ? ) -- ... ? )
|
||||
[ not ] compose assoc-any-key? not ; inline
|
||||
|
||||
: assoc-all-value? ( ... assoc quot: ( ... key -- ... ? ) -- ... ? )
|
||||
[ not ] compose assoc-any-value? not ; inline
|
||||
|
||||
: any-multi-key? ( assoc -- ? )
|
||||
[ sequence? ] assoc-any-key? ;
|
||||
|
||||
: any-multi-value? ( assoc -- ? )
|
||||
[ sequence? ] assoc-any-value? ;
|
||||
|
||||
: flatten-keys ( assoc -- assoc' )
|
||||
dup any-multi-key? [ expand-keys-set-at flatten-keys ] when ;
|
||||
|
||||
: flatten-values ( assoc -- assoc' )
|
||||
dup any-multi-value? [ expand-values-set-at flatten-values ] when ;
|
||||
|
|
Loading…
Reference in New Issue