]> gitweb.factorcode.org Git - factor.git/commitdiff
sequenece.extras: add occurrence-count like ⊒ in bqn
authorDoug Coleman <doug.coleman@gmail.com>
Thu, 25 Aug 2022 14:10:48 +0000 (10:10 -0400)
committerDoug Coleman <doug.coleman@gmail.com>
Sun, 26 Feb 2023 23:11:03 +0000 (17:11 -0600)
extra/sequences/extras/extras-tests.factor
extra/sequences/extras/extras.factor

index d3ca984448ed1dc6969a1472c25acef2572317f2..e61844900f74f3d71abe509c1b0b0cdd26e5d7b7 100644 (file)
@@ -251,6 +251,27 @@ strings tools.test ;
 { { } } [ { } [ + ] 0accumulate ] unit-test
 { { 100 101 103 107 } } [ { 100 1 2 4 } [ + ] 0accumulate ] unit-test
 
+{
+    H{ { t 6 } { f 5 } }
+    { 0 0 1 1 2 3 4 2 3 4 5 }
+} [
+    { 2 7 1 8 1 7 1 8 2 8 4 } [ even? ] occurrence-count-by
+] unit-test
+
+{
+    H{ { 8 3 } { 1 3 } { 2 2 } { 4 1 } { 7 2 } }
+    { 0 0 0 0 1 1 2 1 1 2 0 }
+} [
+    { 2 7 1 8 1 7 1 8 2 8 4 } occurrence-count
+] unit-test
+
+{
+    H{ { 8 3 } { 1 3 } { 2 2 } { 4 1 } { 7 2 } }
+    { 0 0 0 0 1 1 2 1 1 2 0 }
+} [
+    { 2 7 1 8 1 7 1 8 2 8 4 } [ ] occurrence-count-by
+] unit-test
+
 { { 0 1 2 3 } } [ 8 <iota> [ 4 < ] take-while >array ] unit-test
 { { } } [ { 15 16 } [ 4 < ] take-while >array ] unit-test
 { { 0 1 2 } } [ 3 <iota> [ 4 < ] take-while >array ] unit-test
index 30bbaf65b3f6f69a2a54d9dd6f4407786cbccb2f..a780659c465b538c9dbbb621932bc9ed11342e7a 100644 (file)
@@ -292,6 +292,12 @@ PRIVATE>
 : 0accumulate ( ... seq quot: ( ... prev elt -- ... next ) -- ... final newseq )
     over 0accumulate-as ; inline
 
+: occurrence-count-by ( seq quot: ( elt -- elt' ) -- hash seq )
+    '[ nip @ over inc-at* ] H{ } clone -rot 0accumulate ; inline
+
+: occurrence-count ( seq -- hash seq )
+    [ ] occurrence-count-by ; inline
+
 : 0reduce ( seq quot: ( prev elt -- next ) -- result )
     [ 0 ] dip reduce ; inline