module Data.Range.RangeTreeInternal where

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

evaluateRangeTree :: (Ord a, Enum a) => RangeTree a -> RangeMerge a
evaluateRangeTree (RangeNode operation left right) = case operation of
   RangeUnion -> leftEval `unionRangeMerges` rightEval
   RangeIntersection -> leftEval `intersectionRangeMerges` rightEval
   where
      leftEval = evaluateRangeTree left 
      rightEval = evaluateRangeTree right
evaluateRangeTree (RangeNodeInvert node) = invertRM . evaluateRangeTree $ node
evaluateRangeTree (RangeLeaf ranges) = loadRanges ranges