From: nomennescio Date: Fri, 13 Oct 2023 20:47:02 +0000 (+0200) Subject: Generics minimum and maximum added. X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=ff12d836430b297619c62e7609830b1ca38c317f Generics minimum and maximum added. For finite sequences infinum is minimum, supremum is maximum. Runtime implementation on sequences uses (minimum) and (maximum). Dispatch on object replaced by dispatch on sequence. Inline generics for better optimizations. --- diff --git a/core/sequences/sequences.factor b/core/sequences/sequences.factor index 1ff92d16f7..5ec17cd5b2 100644 --- a/core/sequences/sequences.factor +++ b/core/sequences/sequences.factor @@ -1141,16 +1141,24 @@ M: iota sum length dup 1 - * 2/ ; inline M: repetition sum [ elt>> ] [ length>> ] bi * ; inline : product ( seq -- n ) 1 [ * ] binary-reduce ; +: (minimum) ( seq -- n ) [ ] [ min ] map-reduce ; +: (maximum) ( seq -- n ) [ ] [ max ] map-reduce ; + +GENERIC: minimum ( seq -- elt ) +M: sequence minimum (minimum) ; inline +M: iota minimum first ; inline +M: reversed minimum seq>> minimum ; inline + +GENERIC: maximum ( seq -- elt ) +M: sequence maximum (maximum) ; inline +M: iota maximum last ; inline +M: reversed maximum seq>> maximum ; inline GENERIC: infimum ( seq -- elt ) -M: object infimum [ ] [ min ] map-reduce ; -M: iota infimum first ; -M: reversed infimum seq>> infimum ; +M: sequence infimum minimum ; inline GENERIC: supremum ( seq -- elt ) -M: object supremum [ ] [ max ] map-reduce ; -M: iota supremum last ; -M: reversed supremum seq>> supremum ; +M: sequence supremum maximum ; inline : map-sum ( ... seq quot: ( ... elt -- ... n ) -- ... n ) [ 0 ] 2dip [ dip + ] curry [ swap ] prepose each ; inline