assocs.extra: Add a word to keep only certain keys in an assoc to the same assoc or to a new one.

master
Doug Coleman 2020-08-29 18:43:10 -05:00
parent 87cce0ba6a
commit ce3049decd
2 changed files with 33 additions and 1 deletions

View File

@ -54,4 +54,30 @@ USING: assocs.extras kernel math sequences tools.test ;
H{ { 1 [ sq ] } { 2 [ sq ] } }
} [
{ { { 1 2 { 1 } { 2 } { 1 1 } } [ sq ] } } flatten-keys
] unit-test
{
H{ { "1" 1 } { "2" 2 } }
} [
H{ { "1" 1 } { "2" 2 } { "3" 3 } }
{ "1" "2" "2" }
rekey-new-assoc
] unit-test
{ f } [
H{ { "1" 1 } { "2" 2 } { "3" 3 } }
[ { "1" "2" "2" } rekey-new-assoc ] keep eq?
] unit-test
{
H{ { "1" 1 } { "2" 2 } }
} [
H{ { "1" 1 } { "2" 2 } { "3" 3 } }
{ "1" "2" "2" }
rekey-assoc
] unit-test
{ t } [
H{ { "1" 1 } { "2" 2 } { "3" 3 } }
[ { "1" "2" "2" } rekey-assoc ] keep eq?
] unit-test

View File

@ -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 fry generalizations kernel
math math.statistics sequences sequences.extras ;
math math.statistics sequences sequences.extras sets ;
IN: assocs.extras
: deep-at ( assoc seq -- value/f )
@ -41,6 +41,12 @@ IN: assocs.extras
: reject-values ( assoc quot: ( value -- value' ) -- assoc' )
'[ nip @ ] assoc-reject ; inline
: rekey-new-assoc ( assoc keys -- newassoc )
[ [ of ] keep swap ] with H{ } map>assoc ; inline
: rekey-assoc ( assoc keys -- assoc )
[ dup keys ] dip diff over [ delete-at ] curry each ; inline
: if-assoc-empty ( ..a assoc quot1: ( ..a -- ..b ) quot2: ( ..a assoc -- ..b ) -- ..b )
[ dup assoc-empty? ] [ [ drop ] prepose ] [ ] tri* if ; inline