{-# LANGUAGE Safe #-}
module Data.Range.Algebra.Range where

import Data.Range.Data
import Data.Range.RangeInternal (exportRangeMerge, loadRanges)
import Data.Range.Algebra.Internal

import Control.Monad.Free

rangeAlgebra :: (Ord a) => Algebra RangeExprF [Range a]
rangeAlgebra :: forall a. Ord a => Algebra RangeExprF [Range a]
rangeAlgebra = RangeMerge a -> [Range a]
forall a. Eq a => RangeMerge a -> [Range a]
exportRangeMerge (RangeMerge a -> [Range a])
-> (RangeExprF [Range a] -> RangeMerge a)
-> RangeExprF [Range a]
-> [Range a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RangeExprF (RangeMerge a) -> RangeMerge a)
-> Free RangeExprF (RangeMerge a) -> RangeMerge a
forall (f :: * -> *) a. Functor f => (f a -> a) -> Free f a -> a
iter RangeExprF (RangeMerge a) -> RangeMerge a
forall a. Ord a => Algebra RangeExprF (RangeMerge a)
rangeMergeAlgebra (Free RangeExprF (RangeMerge a) -> RangeMerge a)
-> (RangeExprF [Range a] -> Free RangeExprF (RangeMerge a))
-> RangeExprF [Range a]
-> RangeMerge a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RangeExprF (Free RangeExprF (RangeMerge a))
-> Free RangeExprF (RangeMerge a)
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (RangeExprF (Free RangeExprF (RangeMerge a))
 -> Free RangeExprF (RangeMerge a))
-> (RangeExprF [Range a]
    -> RangeExprF (Free RangeExprF (RangeMerge a)))
-> RangeExprF [Range a]
-> Free RangeExprF (RangeMerge a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Range a] -> Free RangeExprF (RangeMerge a))
-> RangeExprF [Range a]
-> RangeExprF (Free RangeExprF (RangeMerge a))
forall a b. (a -> b) -> RangeExprF a -> RangeExprF b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (RangeMerge a -> Free RangeExprF (RangeMerge a)
forall (f :: * -> *) a. a -> Free f a
Pure (RangeMerge a -> Free RangeExprF (RangeMerge a))
-> ([Range a] -> RangeMerge a)
-> [Range a]
-> Free RangeExprF (RangeMerge a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Range a] -> RangeMerge a
forall a. Ord a => [Range a] -> RangeMerge a
loadRanges)