I support something like this.  Also maybe see my "maximal-elements"
here:

http://groups.google.com/group/clojure/browse_thread/thread/134642cc76de17f7?hl=en#

A nice feature of getting all the maximal elements is you can do
(first (maximal-elements ...)) to recreate functions like yours but
also things like  (random-element (maximal-elements ...)).

-Jason

On Jan 21, 8:09 pm, Vincent Foley <vfo...@gmail.com> wrote:
> A couple months ago, there was a discussion in this group about the
> functions max and min and making them work with data types other than
> numbers.  I was toying around tonight, and I wrote the following
> functions.
>
> (defn- boundary
>   [compare-fn f & args]
>   (reduce (fn [a b] (if (compare-fn (compare (f b) (f a)))
>                       b
>                       a)) args))
>
> (defn greatest-by
>   "Return the argument for which f returns the greatest value."
>   [f & args]
>   (apply boundary pos? f args))
>
> (defn greatest
>   "Return the greatest argument."
>   [& args]
>   (apply greatest-by identity args))
>
> (defn least-by
>   "Return the argument for which f returns the smallest value."
>   [f & args]
>   (apply boundary neg? f args))
>
> (defn least
>   "Return the smallest element."
>   [& args]
>   (apply least-by identity args))
>
> user> (greatest 1 3 2)
> 3
> user> (greatest "foo" "bar" "baz")
> "foo"
> user> (greatest-by count "foo" "bar" "abccb")
> "abccb"
> user> (least 1 3 2)
> 1
> user> (least "foo" "bar" "baz")
> "bar"
> user> (least-by count "foo" "bar" "abccb")
> "foo"
> user>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to