-- | Internally the range library converts your ranges into an internal representation of
-- multiple ranges that I call a RangeMerge. When you do multiple unions and intersections
-- in a row converting to and from that data structure becomes extra work that is not
-- required. To amortize those costs away the RangeTree structure exists. You can specify
-- a tree of operations in advance and then evaluate them all at once. This is not only
-- useful for efficiency but for parsing too. Use RangeTree's whenever you wish to perform
-- multiple operations in a row and wish for it to be as efficient as possible.
module Data.Range.RangeTree 
   ( evaluate
   , RangeTree(..)
   , RangeOperation(..)
   ) where

import Data.Range.Data
import Data.Range.RangeInternal
import Data.Range.RangeTreeInternal

-- | 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 = exportRangeMerge . evaluateRangeTree