]> gitweb.factorcode.org Git - factor.git/commitdiff
sequences: More efficient longest and shortest by moving infimum-by/supremum-by into...
authorDoug Coleman <doug.coleman@gmail.com>
Tue, 12 Mar 2013 01:33:54 +0000 (18:33 -0700)
committerDoug Coleman <doug.coleman@gmail.com>
Tue, 12 Mar 2013 01:35:53 +0000 (18:35 -0700)
core/sequences/sequences-tests.factor
core/sequences/sequences.factor
extra/sequences/extras/extras-tests.factor
extra/sequences/extras/extras.factor

index 26f75e50f99814cb84042c3cfe884575c92cc811..391221187230c9a69896402e46158d3ba4ae97a6 100644 (file)
@@ -1,7 +1,7 @@
 USING: arrays byte-arrays kernel math math.order math.parser
 namespaces sequences kernel.private sequences.private strings
 sbufs tools.test vectors assocs generic vocabs.loader
-generic.single ;
+generic.single math.vectors ;
 IN: sequences.tests
 
 [ "empty" ] [ { } [ "empty" ] [ "not empty" ] if-empty ] unit-test
@@ -351,3 +351,27 @@ USE: make
 [ { } { } [ [ string>digits product ] bi@ + ] [ + ] 2map-reduce ] must-infer
 [ { } { } [ + ] [ + ] 2map-reduce ] must-fail
 [ 24 ] [ { 1 2 } { 3 4 } [ + ] [ * ] 2map-reduce ] unit-test
+
+[ 4 ] [ 5 iota [ ] supremum-by ] unit-test
+[ 0 ] [ 5 iota [ ] infimum-by ] unit-test
+{ "bar" } [ { "bar" "baz" "qux" } [ length ] supremum-by ] unit-test
+{ "bar" } [ { "bar" "baz" "qux" } [ length ] infimum-by ] unit-test
+[ { "foo" } ] [ { { "foo" } { "bar" } } [ first ] supremum-by ] unit-test
+[ { "bar" } ] [ { { "foo" } { "bar" } } [ first ] infimum-by ] unit-test
+
+[ { 0 0 255 } ] [
+    {
+        { 0 0 0 }
+        { 95 255 95 }
+        { 215 95 95 }
+        { 95 135 255 }
+        { 135 95 135 }
+        { 135 255 255 }
+        { 0 0 255 }
+        { 0 95 95 }
+        { 0 255 215 }
+        { 135 0 95 }
+        { 255 0 175 }
+    } [ { 0 0 255 } distance ] infimum-by
+] unit-test
+
index cdd88081f7c3dfde7e44a03713fcd6fdd22cb38b..df0da366ca27f7459eeeaaca2709611fb56e8a24 100644 (file)
@@ -1016,11 +1016,26 @@ M: object sum 0 [ + ] binary-reduce ; inline
 : cartesian-product ( seq1 seq2 -- newseq )
     [ { } 2sequence ] cartesian-map ;
 
-: filter-length ( seq n -- seq' ) [ swap length = ] curry filter ;
+: each-from ( ... seq quot: ( ... x -- ... ) i -- ... )
+    -rot (each) (each-integer) ; inline
 
-: shortest ( seqs -- elt ) [ ] [ shorter ] map-reduce ;
+: supremum-by ( seq quot: ( ... elt -- ... x ) -- elt )
+    [ [ first dup ] dip call ] 2keep [
+        dupd call pick dupd after?
+        [ [ 2drop ] 2dip ] [ 2drop ] if
+    ] curry 1 each-from drop ; inline
 
-: longest ( seqs -- elt ) [ ] [ longer ] map-reduce ;
+: infimum-by ( seq quot: ( ... elt -- ... x ) -- elt )
+    [ [ first dup ] dip call ] 2keep [
+        dupd call pick dupd before?
+        [ [ 2drop ] 2dip ] [ 2drop ] if
+    ] curry 1 each-from drop ; inline
+
+: filter-length ( seq n -- seq' ) swap [ length = ] with filter ;
+
+: shortest ( seqs -- elt ) [ length ] infimum-by ;
+
+: longest ( seqs -- elt ) [ length ] supremum-by ;
 
 : all-shortest ( seqs -- seqs' ) dup shortest length filter-length ;
 
index c68c26b812360cab0a82e46a83b6efb4011f3aca..eeaa3e00eb78bccca2f620e7ed705b081175939c 100644 (file)
@@ -4,29 +4,6 @@ tools.test ;
 
 IN: sequences.extras.tests
 
-[ 4 ] [ 5 iota [ ] supremum-by ] unit-test
-[ 0 ] [ 5 iota [ ] infimum-by ] unit-test
-{ "bar" } [ { "bar" "baz" "qux" } [ length ] supremum-by ] unit-test
-{ "bar" } [ { "bar" "baz" "qux" } [ length ] infimum-by ] unit-test
-[ { "foo" } ] [ { { "foo" } { "bar" } } [ first ] supremum-by ] unit-test
-[ { "bar" } ] [ { { "foo" } { "bar" } } [ first ] infimum-by ] unit-test
-
-[ { 0 0 255 } ] [
-    {
-        { 0 0 0 }
-        { 95 255 95 }
-        { 215 95 95 }
-        { 95 135 255 }
-        { 135 95 135 }
-        { 135 255 255 }
-        { 0 0 255 }
-        { 0 95 95 }
-        { 0 255 215 }
-        { 135 0 95 }
-        { 255 0 175 }
-    } [ { 0 0 255 } distance ] infimum-by
-] unit-test
-
 { V{ 0 1 2 3 4 5 6 7 8 9 } } [
     V{ } clone
     10 iota >array randomize
index 9ea2c42ea2d4d045bf2bd39dadcc36a4abf4c814..87704d7d55f819bfd0a28a2bfa1fee11ca1e4c8d 100644 (file)
@@ -28,24 +28,9 @@ IN: sequences.extras
 : insert-sorted ( elt seq -- seq )
     2dup [ < ] with find drop over length or swap insert-nth ;
 
-: each-from ( ... seq quot: ( ... x -- ... ) i -- ... )
-    -rot (each) (each-integer) ; inline
-
 : reduce-from ( ... seq identity quot: ( ... prev elt -- ... next ) i -- ... result )
     [ swap ] 2dip each-from ; inline
 
-: supremum-by ( seq quot: ( ... elt -- ... x ) -- elt )
-    [ [ first dup ] dip call ] 2keep [
-        dupd call pick dupd after?
-        [ [ 2drop ] 2dip ] [ 2drop ] if
-    ] curry 1 each-from drop ; inline
-
-: infimum-by ( seq quot: ( ... elt -- ... x ) -- elt )
-    [ [ first dup ] dip call ] 2keep [
-        dupd call pick dupd before?
-        [ [ 2drop ] 2dip ] [ 2drop ] if
-    ] curry 1 each-from drop ; inline
-
 : all-subseqs ( seq -- seqs )
     dup length [1,b] [ <clumps> ] with map concat ;