@@ -90,7 +90,9 @@ module Streamly.Streams.StreamK
9090 , any
9191 , last
9292 , minimum
93+ , minimumBy
9394 , maximum
95+ , maximumBy
9496 , findIndices
9597 , lookup
9698 , find
@@ -712,6 +714,26 @@ minimum m = go Nothing (toStream m)
712714 else go (Just a) r
713715 in unStream m1 defState stop single yieldk
714716
717+{-# INLINE minimumBy #-}
718+minimumBy :: (IsStream t, Monad m) => (a -> a -> Ordering) -> t m a -> m (Maybe a)
719+minimumBy cmp m = go Nothing (toStream m)
720+ where
721+ go Nothing m1 =
722+ let stop = return Nothing
723+ single a = return (Just a)
724+ yieldk a r = go (Just a) r
725+ in unStream m1 defState stop single yieldk
726+
727+ go (Just res) m1 =
728+ let stop = return (Just res)
729+ single a = case cmp res a of
730+ GT -> return (Just a)
731+ _ -> return (Just res)
732+ yieldk a r = case cmp res a of
733+ GT -> go (Just a) r
734+ _ -> go (Just res) r
735+ in unStream m1 defState stop single yieldk
736+
715737{-# INLINE maximum #-}
716738maximum :: (IsStream t, Monad m, Ord a) => t m a -> m (Maybe a)
717739maximum m = go Nothing (toStream m)
@@ -734,6 +756,26 @@ maximum m = go Nothing (toStream m)
734756 else go (Just res) r
735757 in unStream m1 defState stop single yieldk
736758
759+{-# INLINE maximumBy #-}
760+maximumBy :: (IsStream t, Monad m) => (a -> a -> Ordering) -> t m a -> m (Maybe a)
761+maximumBy cmp m = go Nothing (toStream m)
762+ where
763+ go Nothing m1 =
764+ let stop = return Nothing
765+ single a = return (Just a)
766+ yieldk a r = go (Just a) r
767+ in unStream m1 defState stop single yieldk
768+
769+ go (Just res) m1 =
770+ let stop = return (Just res)
771+ single a = case cmp res a of
772+ GT -> return (Just res)
773+ _ -> return (Just a)
774+ yieldk a r = case cmp res a of
775+ GT -> go (Just res) r
776+ _ -> go (Just a) r
777+ in unStream m1 defState stop single yieldk
778+
737779{-# INLINE (!!) #-}
738780(!!) :: (IsStream t, Monad m) => t m a -> Int -> m (Maybe a)
739781m !! i = go i (toStream m)