module Pandora.Paradigm.Structure.Ability.Monotonic where import Pandora.Pattern.Functor ((<+>)) import Pandora.Pattern.Functor.Pointable (Pointable) import Pandora.Pattern.Functor.Avoidable (Avoidable (empty)) import Pandora.Paradigm.Primary.Functor.Predicate (Predicate, satisfy) class Monotonic e a where bypass :: (a -> r -> r) -> r -> e -> r instance Monotonic a a where bypass :: (a -> r -> r) -> r -> a -> r bypass a -> r -> r f r r a x = a -> r -> r f a x r r find :: (Monotonic e a, Pointable t, Avoidable t) => Predicate a -> e -> t a find :: Predicate a -> e -> t a find Predicate a p e struct = (a -> t a -> t a) -> t a -> e -> t a forall e a r. Monotonic e a => (a -> r -> r) -> r -> e -> r bypass (\a x t a r -> t a r t a -> t a -> t a forall (t :: * -> *) a. Alternative t => t a -> t a -> t a <+> Predicate a -> a -> t a forall (t :: * -> *) a. (Pointable t, Avoidable t) => Predicate a -> a -> t a satisfy Predicate a p a x) t a forall (t :: * -> *) a. Avoidable t => t a empty e struct