{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Data.Range.Typed.Algebra
( RangeExpr,
const,
invert,
union,
intersection,
difference,
Algebra,
RangeAlgebra (..),
)
where
import Control.Monad.Free
import Data.Range.Typed.Algebra.Internal
import Data.Range.Typed.Algebra.Predicate
import Data.Range.Typed.Algebra.Range
import Data.Range.Typed.Data
import Prelude hiding (const)
const :: a -> RangeExpr a
const :: forall a. a -> RangeExpr a
const = Free RangeExprF a -> RangeExpr a
forall a. Free RangeExprF a -> RangeExpr a
RangeExpr (Free RangeExprF a -> RangeExpr a)
-> (a -> Free RangeExprF a) -> a -> RangeExpr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Free RangeExprF a
forall (f :: * -> *) a. a -> Free f a
Pure
invert :: RangeExpr a -> RangeExpr a
invert :: forall a. RangeExpr a -> RangeExpr a
invert = Free RangeExprF a -> RangeExpr a
forall a. Free RangeExprF a -> RangeExpr a
RangeExpr (Free RangeExprF a -> RangeExpr a)
-> (RangeExpr a -> Free RangeExprF a) -> RangeExpr a -> RangeExpr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExprF (Free RangeExprF a) -> Free RangeExprF a
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (RangeExprF (Free RangeExprF a) -> Free RangeExprF a)
-> (RangeExpr a -> RangeExprF (Free RangeExprF a))
-> RangeExpr a
-> Free RangeExprF a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Free RangeExprF a -> RangeExprF (Free RangeExprF a)
forall r. r -> RangeExprF r
Invert (Free RangeExprF a -> RangeExprF (Free RangeExprF a))
-> (RangeExpr a -> Free RangeExprF a)
-> RangeExpr a
-> RangeExprF (Free RangeExprF a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExpr a -> Free RangeExprF a
forall a. RangeExpr a -> Free RangeExprF a
getFree
union :: RangeExpr a -> RangeExpr a -> RangeExpr a
union :: forall a. RangeExpr a -> RangeExpr a -> RangeExpr a
union RangeExpr a
a RangeExpr a
b = Free RangeExprF a -> RangeExpr a
forall a. Free RangeExprF a -> RangeExpr a
RangeExpr (Free RangeExprF a -> RangeExpr a)
-> (RangeExprF (Free RangeExprF a) -> Free RangeExprF a)
-> RangeExprF (Free RangeExprF a)
-> RangeExpr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExprF (Free RangeExprF a) -> Free RangeExprF a
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (RangeExprF (Free RangeExprF a) -> RangeExpr a)
-> RangeExprF (Free RangeExprF a) -> RangeExpr a
forall a b. (a -> b) -> a -> b
$ Free RangeExprF a
-> Free RangeExprF a -> RangeExprF (Free RangeExprF a)
forall r. r -> r -> RangeExprF r
Union (RangeExpr a -> Free RangeExprF a
forall a. RangeExpr a -> Free RangeExprF a
getFree RangeExpr a
a) (RangeExpr a -> Free RangeExprF a
forall a. RangeExpr a -> Free RangeExprF a
getFree RangeExpr a
b)
intersection :: RangeExpr a -> RangeExpr a -> RangeExpr a
intersection :: forall a. RangeExpr a -> RangeExpr a -> RangeExpr a
intersection RangeExpr a
a RangeExpr a
b = Free RangeExprF a -> RangeExpr a
forall a. Free RangeExprF a -> RangeExpr a
RangeExpr (Free RangeExprF a -> RangeExpr a)
-> (RangeExprF (Free RangeExprF a) -> Free RangeExprF a)
-> RangeExprF (Free RangeExprF a)
-> RangeExpr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExprF (Free RangeExprF a) -> Free RangeExprF a
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (RangeExprF (Free RangeExprF a) -> RangeExpr a)
-> RangeExprF (Free RangeExprF a) -> RangeExpr a
forall a b. (a -> b) -> a -> b
$ Free RangeExprF a
-> Free RangeExprF a -> RangeExprF (Free RangeExprF a)
forall r. r -> r -> RangeExprF r
Intersection (RangeExpr a -> Free RangeExprF a
forall a. RangeExpr a -> Free RangeExprF a
getFree RangeExpr a
a) (RangeExpr a -> Free RangeExprF a
forall a. RangeExpr a -> Free RangeExprF a
getFree RangeExpr a
b)
difference :: RangeExpr a -> RangeExpr a -> RangeExpr a
difference :: forall a. RangeExpr a -> RangeExpr a -> RangeExpr a
difference RangeExpr a
a RangeExpr a
b = Free RangeExprF a -> RangeExpr a
forall a. Free RangeExprF a -> RangeExpr a
RangeExpr (Free RangeExprF a -> RangeExpr a)
-> (RangeExprF (Free RangeExprF a) -> Free RangeExprF a)
-> RangeExprF (Free RangeExprF a)
-> RangeExpr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExprF (Free RangeExprF a) -> Free RangeExprF a
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (RangeExprF (Free RangeExprF a) -> RangeExpr a)
-> RangeExprF (Free RangeExprF a) -> RangeExpr a
forall a b. (a -> b) -> a -> b
$ Free RangeExprF a
-> Free RangeExprF a -> RangeExprF (Free RangeExprF a)
forall r. r -> r -> RangeExprF r
Difference (RangeExpr a -> Free RangeExprF a
forall a. RangeExpr a -> Free RangeExprF a
getFree RangeExpr a
a) (RangeExpr a -> Free RangeExprF a
forall a. RangeExpr a -> Free RangeExprF a
getFree RangeExpr a
b)
class RangeAlgebra a where
eval :: Algebra RangeExpr a
instance (Ord a) => RangeAlgebra [AnyRange a] where
eval :: Algebra RangeExpr [AnyRange a]
eval = (RangeExprF [AnyRange a] -> [AnyRange a])
-> Free RangeExprF [AnyRange a] -> [AnyRange a]
forall (f :: * -> *) a. Functor f => (f a -> a) -> Free f a -> a
iter RangeExprF [AnyRange a] -> [AnyRange a]
forall a. Ord a => Algebra RangeExprF [AnyRange a]
rangeAlgebra (Free RangeExprF [AnyRange a] -> [AnyRange a])
-> (RangeExpr [AnyRange a] -> Free RangeExprF [AnyRange a])
-> Algebra RangeExpr [AnyRange a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExpr [AnyRange a] -> Free RangeExprF [AnyRange a]
forall a. RangeExpr a -> Free RangeExprF a
getFree
instance RangeAlgebra (a -> Bool) where
eval :: Algebra RangeExpr (a -> Bool)
eval = (RangeExprF (a -> Bool) -> a -> Bool)
-> Free RangeExprF (a -> Bool) -> a -> Bool
forall (f :: * -> *) a. Functor f => (f a -> a) -> Free f a -> a
iter RangeExprF (a -> Bool) -> a -> Bool
forall a. Algebra RangeExprF (a -> Bool)
predicateAlgebra (Free RangeExprF (a -> Bool) -> a -> Bool)
-> (RangeExpr (a -> Bool) -> Free RangeExprF (a -> Bool))
-> Algebra RangeExpr (a -> Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExpr (a -> Bool) -> Free RangeExprF (a -> Bool)
forall a. RangeExpr a -> Free RangeExprF a
getFree