-- | Safe wrappers for 'null'-partial 'Foldable' operations
--
-- >>> minimum []
-- *** Exception: Prelude.minimum: empty list
-- >>> minimum [3,1,2]
-- 1
--
-- >>> defaulting 0 minimum []
-- 0
-- >>> defaulting 0 minimum [3,1,2]
-- 1
--
-- >>> mayhap minimum []
-- Nothing
-- >>> mayhap minimum [3,1,2]
-- Just 1

module Data.Foldable.Safe
( defaulting
, mayhap
) where

-- | Apply a function to 'Foldable' data if it is not 'null'. Otherwise, return a
-- default value.
defaulting :: Foldable f => b -> (f a -> b) -> f a -> b
defaulting d f xs
  | null xs   = d
  | otherwise = f xs

-- | Apply a function to 'Foldable' data if it is not 'null', wrapping the result
-- in 'Just'. Otherwise, return 'Nothing'.
mayhap :: Foldable f => (f a -> b) -> f a -> Maybe b
mayhap f = defaulting Nothing (Just . f)