{-# LANGUAGE ExplicitForAll #-} module Hextra.Foldable where safeFoldr1 :: forall f a. Foldable f => (a -> a -> a) -> f a -> Maybe a safeFoldr1 :: (a -> a -> a) -> f a -> Maybe a safeFoldr1 a -> a -> a f = (a -> Maybe a -> Maybe a) -> Maybe a -> f a -> Maybe a forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr a -> Maybe a -> Maybe a q Maybe a forall a. Maybe a Nothing where q :: a -> Maybe a -> Maybe a q a x Maybe a Nothing = a -> Maybe a forall a. a -> Maybe a Just a x q a x (Just a y) = a -> Maybe a forall a. a -> Maybe a Just (a -> Maybe a) -> a -> Maybe a forall a b. (a -> b) -> a -> b $ a -> a -> a f a x a y safeMaximum :: forall f a. (Foldable f, Ord a) => f a -> Maybe a safeMaximum :: f a -> Maybe a safeMaximum = (a -> a -> a) -> f a -> Maybe a forall (f :: * -> *) a. Foldable f => (a -> a -> a) -> f a -> Maybe a safeFoldr1 a -> a -> a forall a. Ord a => a -> a -> a max safeMinimum :: forall f a. (Foldable f, Ord a) => f a -> Maybe a safeMinimum :: f a -> Maybe a safeMinimum = (a -> a -> a) -> f a -> Maybe a forall (f :: * -> *) a. Foldable f => (a -> a -> a) -> f a -> Maybe a safeFoldr1 a -> a -> a forall a. Ord a => a -> a -> a min