module Data.Range.Algebra.Internal where
import Prelude hiding (const)
import Data.Range.Data
import Data.Range.RangeInternal
import Control.Monad.Free
data RangeExprF r
= Invert r
| Union r r
| Intersection r r
| Difference r r
deriving (Show, Eq, Ord, Functor)
newtype RangeExpr a = RangeExpr { getFree :: Free RangeExprF a }
deriving (Show, Eq, Ord, Functor)
type Algebra f a = f a -> a
rangeMergeAlgebra :: (Ord a, Enum a) => Algebra RangeExprF (RangeMerge a)
rangeMergeAlgebra (Invert a) = invertRM a
rangeMergeAlgebra (Union a b) = a `unionRangeMerges` b
rangeMergeAlgebra (Intersection a b) = a `intersectionRangeMerges` b
rangeMergeAlgebra (Difference a b) = a `intersectionRangeMerges` invertRM b