]> gitweb.factorcode.org Git - factor.git/commitdiff
Optimized minimum and maximum for cycles and element-repeats
authornomennescio <nomennescio@factorcode.org>
Sat, 14 Oct 2023 00:07:18 +0000 (02:07 +0200)
committerJohn Benediktsson <mrjbq7@gmail.com>
Mon, 23 Oct 2023 17:28:52 +0000 (10:28 -0700)
extra/sequences/repeating/repeating-tests.factor
extra/sequences/repeating/repeating.factor

index 1a31125d9dcc1eb061a0307a0ceb48cf6ea2d332..291b12d840e246be57bbdf87ec57a9d31c09d08e 100644 (file)
@@ -1,14 +1,27 @@
-USING: sequences.repeating tools.test ;
+USING: literals sequences sequences.repeating tools.test ;
 
+{ { 1 } } [ { 1 2 3 } 1 cycle ] unit-test
 { { 1 2 3 1 2 } } [ { 1 2 3 } 5 cycle ] unit-test
 { { 1 2 3 1 2 3 1 2 3 } } [ { 1 2 3 } 9 cycle ] unit-test
 
+{ $[ { 1 2 } minimum ] } [ { 1 2 3 } 2 <cycles> minimum ] unit-test
+{ $[ { 1 2 3 1 2 } minimum ] } [ { 1 2 3 } 5 <cycles> minimum ] unit-test
+{ $[ { 1 2 3 1 2 3 1 2 3 } minimum ] } [ { 1 2 3 } 9 <cycles> minimum ] unit-test
+{ $[ { 1 2 } maximum ] } [ { 1 2 3 } 2 <cycles> maximum ] unit-test
+{ $[ { 1 2 3 1 2 } maximum ] } [ { 1 2 3 } 5 <cycles> maximum ] unit-test
+{ $[ { 1 2 3 1 2 3 1 2 3 } maximum ] } [ { 1 2 3 } 9 <cycles> maximum ] unit-test
+
 { { } } [ { 1 2 3 } 0 repeat-elements ] unit-test
 { { 1 2 3 } } [ { 1 2 3 } 1 repeat-elements ] unit-test
 { { 1 1 2 2 3 3 } } [ { 1 2 3 } 2 repeat-elements ] unit-test
 { { 1 1 1 2 2 2 3 3 3 } } [ { 1 2 3 } 3 repeat-elements ] unit-test
 { { 1 1 1 1 2 2 2 2 3 3 3 3 } } [ { 1 2 3 } 4 repeat-elements ] unit-test
 
+{ $[ { 1 1 1 2 2 2 3 3 3 } minimum ] } [ { 1 2 3 } 3 <element-repeats> minimum ] unit-test
+{ $[ { 1 1 1 1 2 2 2 2 3 3 3 3 } minimum ] } [ { 1 2 3 } 4 <element-repeats> minimum ] unit-test
+{ $[ { 1 1 1 2 2 2 3 3 3 } maximum ] } [ { 1 2 3 } 3 <element-repeats> maximum ] unit-test
+{ $[ { 1 1 1 1 2 2 2 2 3 3 3 3 } maximum ] } [ { 1 2 3 } 4 <element-repeats> maximum ] unit-test
+
 { { } } [ { 1 2 3 } 0 repeat ] unit-test
 { { 1 2 3 } } [ { 1 2 3 } 1 repeat ] unit-test
 { { 1 2 3 1 2 3 } } [ { 1 2 3 } 2 repeat ] unit-test
index 71c0c5f7c9751a74807cc38798a409feb3d2e78e..b2eb049cfdeb1f8c18f0d47116c8ddcc93148c33 100644 (file)
@@ -1,5 +1,6 @@
 ! Copyright (C) 2008 Alex Chapman
 ! Copyright (C) 2012 John Benediktsson
+! Copyright (C) 2023 nomennescio
 ! See https://factorcode.org/license.txt for BSD license
 USING: accessors circular kernel math sequences ;
 IN: sequences.repeating
@@ -27,6 +28,15 @@ M: cycles virtual-exemplar circular>> ;
 
 INSTANCE: cycles virtual-sequence
 
+<PRIVATE
+
+: full-cycle? ( cycle -- ? ) [ length>> ] [ circular>> length ] bi >= ; inline
+
+PRIVATE>
+
+M: cycles minimum dup full-cycle? [ circular>> minimum ] [ (minimum) ] if ; inline
+M: cycles maximum dup full-cycle? [ circular>> maximum ] [ (maximum) ] if ; inline
+
 TUPLE: element-repeats < sequence-view
 { times integer read-only } ;