{-# LANGUAGE Safe #-}

module Data.Range.RangeTree {-# DEPRECATED "Use \"Data.Range.Algebra\" instead" #-}
   ( evaluate
   , RangeTree(..)
   , RangeOperation(..)
   ) where

import Data.Range.Data
import qualified Data.Range.Algebra as Alg

toExpr :: RangeTree a -> Alg.RangeExpr [Range a]
toExpr (RangeLeaf a) = Alg.const a
toExpr (RangeNodeInvert a) = Alg.invert (toExpr a)
toExpr (RangeNode RangeUnion a b) = Alg.union (toExpr a) (toExpr b)
toExpr (RangeNode RangeIntersection a b) = Alg.intersection (toExpr a) (toExpr b)
toExpr (RangeNode RangeDifference a b) = Alg.difference (toExpr a) (toExpr b)

-- | Evaluates a Range Tree into the final set of ranges that it compresses down to. Use
-- this whenever you want to finally evaluate your constructed Range Tree.
evaluate :: (Ord a, Enum a) => RangeTree a -> [Range a]
evaluate = Alg.eval . toExpr