@@ -48,6 +48,9 @@ module Streamly.Streams.StreamK
4848 , yieldK
4949 , consK
5050
51+ -- * Deconstruction
52+ , uncons
53+
5154 -- * Generation
5255 -- ** Unfolds
5356 , unfoldr
@@ -75,6 +78,9 @@ module Streamly.Streams.StreamK
7578
7679 -- ** Specialized Folds
7780 , runStream
81+ , null
82+ , head
83+ , tail
7884 , elem
7985 , notElem
8086 , all
@@ -131,7 +137,7 @@ import Data.Semigroup (Semigroup(..))
131137import Prelude
132138 hiding (foldl, foldr, last, map, mapM, mapM_, repeat, sequence,
133139 take, filter, all, any, takeWhile, drop, dropWhile, minimum,
134− maximum, elem, notElem)
140+ maximum, elem, notElem, null, head, tail)
135141import qualified Prelude
136142
137143import Streamly.SVar
@@ -337,6 +343,18 @@ instance IsStream Stream where
337343 (|:) :: Monad m => m a -> Stream m a -> Stream m a
338344 (|:) = consMSerial
339345
346+-------------------------------------------------------------------------------
347+-- Deconstruction
348+-------------------------------------------------------------------------------
349+
350+{-# INLINE uncons #-}
351+uncons :: (IsStream t, Monad m) => t m a -> m (Maybe (a, t m a))
352+uncons m =
353+ let stop = return Nothing
354+ single a = return (Just (a, nil))
355+ yieldk a r = return (Just (a, fromStream r))
356+ in (unStream (toStream m)) Nothing stop single yieldk
357+
340358-------------------------------------------------------------------------------
341359-- Generation
342360-------------------------------------------------------------------------------
@@ -514,6 +532,7 @@ foldlM' step begin m = foldxM step (return begin) return m
514532-- Specialized folds
515533------------------------------------------------------------------------------
516534
535+{-# INLINE runStream #-}
517536runStream :: (Monad m, IsStream t) => t m a -> m ()
518537runStream m = go (toStream m)
519538 where
@@ -521,7 +540,31 @@ runStream m = go (toStream m)
521540 let stop = return ()
522541 single _ = return ()
523542 yieldk _ r = go (toStream r)
524− in (unStream m1) Nothing stop single yieldk
543+ in unStream m1 Nothing stop single yieldk
544+
545+{-# INLINE null #-}
546+null :: (IsStream t, Monad m) => t m a -> m Bool
547+null m =
548+ let stop = return True
549+ single _ = return False
550+ yieldk _ _ = return False
551+ in unStream (toStream m) Nothing stop single yieldk
552+
553+{-# INLINE head #-}
554+head :: (IsStream t, Monad m) => t m a -> m (Maybe a)
555+head m =
556+ let stop = return Nothing
557+ single a = return (Just a)
558+ yieldk a _ = return (Just a)
559+ in unStream (toStream m) Nothing stop single yieldk
560+
561+{-# INLINE tail #-}
562+tail :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
563+tail m =
564+ let stop = return Nothing
565+ single _ = return $ Just nil
566+ yieldk _ r = return $ Just $ fromStream r
567+ in unStream (toStream m) Nothing stop single yieldk
525568
526569{-# INLINE elem #-}
527570elem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool