Sort a list by comparing the results of a key function applied to each
element.
sortOn f is equivalent to
sortBy
(comparing f), but has the performance advantage of only
evaluating
f once for each element in the input list. This is
called the decorate-sort-undecorate paradigm, or
Schwartzian
transform.
Elements are arranged from lowest to highest, keeping duplicates in
the order they appeared in the input.
The argument must be finite.
Examples
>>> sortOn fst [(2, "world"), (4, "!"), (1, "Hello")]
[(1,"Hello"),(2,"world"),(4,"!")]
>>> sortOn length ["jim", "creed", "pam", "michael", "dwight", "kevin"]
["jim","pam","creed","kevin","dwight","michael"]
Performance notes
This function minimises the projections performed, by materialising
the projections in an intermediate list.
For trivial projections, you should prefer using
sortBy with
comparing, for example:
>>> sortBy (comparing fst) [(3, 1), (2, 2), (1, 3)]
[(1,3),(2,2),(3,1)]
Or, for the exact same API as
sortOn, you can use `sortBy .
comparing`:
>>> (sortBy . comparing) fst [(3, 1), (2, 2), (1, 3)]
[(1,3),(2,2),(3,1)]