@@ -78,6 +78,8 @@ module Streamly.Streams.StreamK
7878 , all
7979 , any
8080 , last
81+ , minimum
82+ , maximum
8183
8284 -- ** Map and Fold
8385 , mapM_
@@ -126,7 +128,8 @@ import Control.Monad.Trans.Class (MonadTrans(lift))
126128import Data.Semigroup (Semigroup(..))
127129import Prelude
128130 hiding (foldl, foldr, last, map, mapM, mapM_, repeat, sequence,
129− take, filter, all, any, takeWhile, drop, dropWhile)
131+ take, filter, all, any, takeWhile, drop, dropWhile, minimum,
132+ maximum)
130133import qualified Prelude
131134
132135import Streamly.SVar
@@ -543,6 +546,50 @@ any p m = go (toStream m)
543546last :: (IsStream t, Monad m) => t m a -> m (Maybe a)
544547last = foldx (\_ y -> Just y) Nothing id
545548
549+{-# INLINE minimum #-}
550+minimum :: (IsStream t, Monad m, Ord a) => t m a -> m (Maybe a)
551+minimum m = go Nothing (toStream m)
552+ where
553+ go Nothing m1 =
554+ let stop = return Nothing
555+ single a = return (Just a)
556+ yieldk a r = go (Just a) r
557+ in unStream m1 Nothing stop single yieldk
558+
559+ go (Just res) m1 =
560+ let stop = return (Just res)
561+ single a =
562+ if res <= a
563+ then return (Just res)
564+ else return (Just a)
565+ yieldk a r =
566+ if res <= a
567+ then go (Just res) r
568+ else go (Just a) r
569+ in unStream m1 Nothing stop single yieldk
570+
571+{-# INLINE maximum #-}
572+maximum :: (IsStream t, Monad m, Ord a) => t m a -> m (Maybe a)
573+maximum m = go Nothing (toStream m)
574+ where
575+ go Nothing m1 =
576+ let stop = return Nothing
577+ single a = return (Just a)
578+ yieldk a r = go (Just a) r
579+ in unStream m1 Nothing stop single yieldk
580+
581+ go (Just res) m1 =
582+ let stop = return (Just res)
583+ single a =
584+ if res <= a
585+ then return (Just a)
586+ else return (Just res)
587+ yieldk a r =
588+ if res <= a
589+ then go (Just a) r
590+ else go (Just res) r
591+ in unStream m1 Nothing stop single yieldk
592+
546593------------------------------------------------------------------------------
547594-- Map and Fold
548595------------------------------------------------------------------------------