[ drop 0 ]
[ swap [ first-unsafe ] [ last-unsafe ] bi + * 2 / ] if-zero ;
+M: range infimum
+ dup step>> 0 > [ first ] [ last ] if ;
+
+M: range supremum
+ dup step>> 0 > [ last ] [ first ] if ;
+
<PRIVATE
: twiddle ( a b -- a b step ) 2dup > -1 1 ? ; inline
: product ( seq -- n ) 1 [ * ] binary-reduce ;
-: infimum ( seq -- elt ) [ ] [ min ] map-reduce ;
-
-: supremum ( seq -- elt ) [ ] [ max ] map-reduce ;
+GENERIC: infimum ( seq -- elt )
+M: object infimum [ ] [ min ] map-reduce ;
+M: iota infimum first ;
+M: reversed infimum seq>> infimum ;
+
+GENERIC: supremum ( seq -- elt )
+M: object supremum [ ] [ max ] map-reduce ;
+M: iota supremum last ;
+M: reversed supremum seq>> supremum ;
: map-sum ( ... seq quot: ( ... elt -- ... n ) -- ... n )
[ 0 ] 2dip [ dip + ] curry [ swap ] prepose each ; inline