module HaskellWorks.Data.Foldable
  ( foldFirst
  , foldLast
  ) where

foldFirst :: Foldable t => t a -> Maybe a
foldFirst :: forall (t :: * -> *) a. Foldable t => t a -> Maybe a
foldFirst = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (forall a b. a -> b -> a
const forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just) forall a. Maybe a
Nothing
{-# INLINE foldFirst #-}

foldLast :: Foldable t => t a -> Maybe a
foldLast :: forall (t :: * -> *) a. Foldable t => t a -> Maybe a
foldLast = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl forall a. Maybe a -> a -> Maybe a
go forall a. Maybe a
Nothing
  where go :: Maybe a -> a -> Maybe a
        go :: forall a. Maybe a -> a -> Maybe a
go Maybe a
_ = forall a. a -> Maybe a
Just
{-# INLINE foldLast #-}