{-# 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