{-# LANGUAGE Safe #-}
module Data.Range.Algebra.Predicate where

import Control.Applicative

import Data.Range.Algebra.Internal

predicateAlgebra :: Algebra RangeExprF (a -> Bool)
predicateAlgebra :: forall a. Algebra RangeExprF (a -> Bool)
predicateAlgebra (Invert a -> Bool
f)         = (Bool -> Bool) -> (a -> Bool) -> a -> Bool
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA Bool -> Bool
not a -> Bool
f
predicateAlgebra (Union a -> Bool
f a -> Bool
g)        = (Bool -> Bool -> Bool) -> (a -> Bool) -> (a -> Bool) -> a -> Bool
forall a b c. (a -> b -> c) -> (a -> a) -> (a -> b) -> a -> c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Bool -> Bool -> Bool
(||) a -> Bool
f a -> Bool
g
predicateAlgebra (Intersection a -> Bool
f a -> Bool
g) = (Bool -> Bool -> Bool) -> (a -> Bool) -> (a -> Bool) -> a -> Bool
forall a b c. (a -> b -> c) -> (a -> a) -> (a -> b) -> a -> c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Bool -> Bool -> Bool
(&&) a -> Bool
f a -> Bool
g
predicateAlgebra (Difference a -> Bool
f a -> Bool
g)   = (Bool -> Bool -> Bool) -> (a -> Bool) -> (a -> Bool) -> a -> Bool
forall a b c. (a -> b -> c) -> (a -> a) -> (a -> b) -> a -> c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Bool -> Bool -> Bool
(&&~) a -> Bool
f a -> Bool
g
  where &&~ :: Bool -> Bool -> Bool
(&&~) Bool
a Bool
b = Bool
a Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
b