@@ -81,6 +81,7 @@ module Streamly.Streams.StreamK
8181 , null
8282 , head
8383 , tail
84+ , init
8485 , elem
8586 , notElem
8687 , all
@@ -141,7 +142,7 @@ import Data.Semigroup (Semigroup(..))
141142import Prelude
142143 hiding (foldl, foldr, last, map, mapM, mapM_, repeat, sequence,
143144 take, filter, all, any, takeWhile, drop, dropWhile, minimum,
144− maximum, elem, notElem, null, head, tail, zipWith)
145+ maximum, elem, notElem, null, head, tail, init, zipWith)
145146import qualified Prelude
146147
147148import Streamly.SVar
@@ -570,6 +571,20 @@ tail m =
570571 yieldk _ r = return $ Just $ fromStream r
571572 in unStream (toStream m) defState stop single yieldk
572573
574+{-# INLINE init #-}
575+init :: (IsStream t, Monad m) => t m a -> m (Maybe (t m a))
576+init m = go1 (toStream m)
577+ where
578+ go1 m1 = do
579+ r <- uncons m1
580+ case r of
581+ Nothing -> return Nothing
582+ Just (h, t) -> return . Just . fromStream $ go h t
583+ go p m1 = Stream $ \_ stp sng yld ->
584+ let single _ = sng p
585+ yieldk a x = yld p $ go a x
586+ in unStream m1 defState stp single yieldk
587+
573588{-# INLINE elem #-}
574589elem :: (IsStream t, Monad m, Eq a) => a -> t m a -> m Bool
575590elem e m = go (toStream m)