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
\ No newline at end of file
! 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 )
: 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