{-# LANGUAGE Safe #-}
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
module Data.Range.Algebra
(
RangeExpr
, const, invert, union, intersection, difference
, Algebra, RangeAlgebra(..)
) where
import Prelude hiding (const)
import Data.Range.Data
import Data.Range.Algebra.Internal
import Data.Range.Algebra.Range
import Data.Range.Algebra.Predicate
import Control.Monad.Free
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 [Range a] where
eval :: Algebra RangeExpr [Range a]
eval = (RangeExprF [Range a] -> [Range a])
-> Free RangeExprF [Range a] -> [Range a]
forall (f :: * -> *) a. Functor f => (f a -> a) -> Free f a -> a
iter RangeExprF [Range a] -> [Range a]
forall a. Ord a => Algebra RangeExprF [Range a]
rangeAlgebra (Free RangeExprF [Range a] -> [Range a])
-> (RangeExpr [Range a] -> Free RangeExprF [Range a])
-> Algebra RangeExpr [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExpr [Range a] -> Free RangeExprF [Range 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