@@ -100,6 +100,7 @@ module Streamly.Internal.Data.StreamK
100100
101101 -- ** Reordering
102102 , sortBy
103+ , sortOn
103104
104105 -- ** Map and Filter
105106 , mapMaybe
@@ -131,6 +132,7 @@ import Control.Exception (mask_, Exception)
131132import Control.Monad (void, join)
132133import Control.Monad.Catch (MonadCatch)
133134import Control.Monad.IO.Class (MonadIO(..))
135+import Data.Ord (comparing)
134136import Data.Proxy (Proxy(..))
135137import GHC.Types (SPEC(..))
136138import Streamly.Internal.Data.Array.Type (Array(..))
@@ -1717,3 +1719,10 @@ sortBy cmp =
17171719 . Stream.catRights -- its a non-failing backtracking parser
17181720 . Stream.parseMany (fmap (either id id) p)
17191721 . Stream.fromStreamK
1722+
1723+{-# INLINE sortOn #-}
1724+sortOn :: (Monad m, Ord b) => (a -> b) -> StreamK m a -> StreamK m a
1725+sortOn f =
1726+ fmap snd
1727+ . sortBy (comparing fst)
1728+ . fmap (\x -> let y = f x in y `seq` (y, x))