diff --git a/extra/sequences/extras/extras-tests.factor b/extra/sequences/extras/extras-tests.factor index d01f60752e..65d27895ac 100644 --- a/extra/sequences/extras/extras-tests.factor +++ b/extra/sequences/extras/extras-tests.factor @@ -171,3 +171,7 @@ IN: sequences.extras.tests { "foo" " bar" } [ "foo bar" [ blank? ] cut-when ] unit-test { { 4 0 3 1 2 } } [ { 0 4 1 3 2 } 5 iota [ nth* ] curry map ] unit-test + +{ 1 "beef" } [ { "chicken" "beef" "moose" } [ length ] infimum-by* ] unit-test +{ 0 "chicken" } [ { "chicken" "beef" "moose" } [ length ] supremum-by* ] unit-test +{ 2 "moose" } [ { "chicken" "beef" "moose" } [ first ] supremum-by* ] unit-test diff --git a/extra/sequences/extras/extras.factor b/extra/sequences/extras/extras.factor index 03b1fcda5c..648bc7166e 100644 --- a/extra/sequences/extras/extras.factor +++ b/extra/sequences/extras/extras.factor @@ -1,6 +1,7 @@ -USING: accessors arrays assocs combinators fry grouping growable -kernel locals make math math.order math.ranges sequences -sequences.deep sequences.private sorting splitting vectors ; +USING: accessors arrays assocs combinators fry generalizations +grouping growable kernel locals make math math.order math.ranges +sequences sequences.deep sequences.private sorting splitting +vectors ; FROM: sequences => change-nth ; IN: sequences.extras @@ -489,3 +490,25 @@ PRIVATE> : nth* ( n seq -- elt ) [ length 1 - swap - ] [ nth ] bi ; inline + +: each-index-from ( ... seq quot: ( ... elt index -- ... ) i -- ... ) + -rot (each-index) (each-integer) ; inline + + + +: supremum-by* ( ... seq quot: ( ... elt -- ... x ) -- ... i elt ) + [ after? ] select-by* ; inline + +: infimum-by* ( ... seq quot: ( ... elt -- ... x ) -- ... i elt ) + [ before? ] select-by* ; inline