]> gitweb.factorcode.org Git - factor.git/commitdiff
assocs.extras: Add assoc-collapse! and assoc-collapse-as
authortimor <timor.dd@googlemail.com>
Thu, 22 Jul 2021 16:29:11 +0000 (18:29 +0200)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 22 Jul 2021 17:10:38 +0000 (10:10 -0700)
`assoc-collapse!` is the destructive version of `assoc-collapse`, but takes the
target assoc as extra element.

For `assoc-collapse-as`, the size of resulting assoc is based on the first assoc
in the input sequence.

extra/assocs/extras/extras-tests.factor
extra/assocs/extras/extras.factor

index 276005980c7ca787e1d26dcf8b8ca8ac7611e58c..a4d7a08efd8edb24e0de631477f2667993bea9d8 100644 (file)
@@ -145,3 +145,22 @@ USING: arrays assocs.extras kernel math math.order sequences tools.test ;
     H{ { 3 30 } { 4 40 } } 3array
     [ min ] assoc-collapse
 ] unit-test
+
+{
+    H{ { 1 11 } { 2 20 } { 3 30 } { 4 40 } }
+} [
+    H{ { 1 11 } { 2 20 } } dup
+    H{ { 2 22 } { 3 33 } }
+    H{ { 3 30 } { 4 40 } } 3array
+    [ min ] assoc-collapse!
+] unit-test
+
+{
+    H{ { 1 11 } { 2 20 } }
+    V{ { 1 11 } { 2 20 } { 3 30 } { 4 40 } }
+} [
+    H{ { 1 11 } { 2 20 } } dup
+    H{ { 2 22 } { 3 33 } }
+    H{ { 3 30 } { 4 40 } } 3array
+    [ min ] V{ } assoc-collapse-as
+] unit-test
index 44b076817967dc63689f19d8e21c56380b550fe2..7abad29da3f2379d973d3440e589547d32450d86 100644 (file)
@@ -82,6 +82,13 @@ IN: assocs.extras
     [ 2drop f ]
     [ [ unclip-slice H{ } or clone ] [ [ assoc-merge! ] curry ] bi* reduce ] if ; inline
 
+: assoc-collapse! ( assoc seq quot: ( value1 value2 -- new-value ) -- assoc )
+    [ assoc-merge! ] curry each ; inline
+
+: assoc-collapse-as ( seq quot: ( value1 value2 -- new-value ) exemplar -- assoc )
+    pick first assoc-size swap new-assoc
+    -rot assoc-collapse! ; inline
+
 GENERIC: delete-value-at ( value assoc -- )
 
 M: assoc delete-value-at