module Data.Range.Typed.Algebra.Range where

import Control.Monad.Free
import Data.Range.Typed.Algebra.Internal
import Data.Range.Typed.Data
import Data.Range.Typed.RangeInternal (exportRangeMerge, loadRanges)

rangeAlgebra :: (Ord a) => Algebra RangeExprF [AnyRange a]
rangeAlgebra :: forall a. Ord a => Algebra RangeExprF [AnyRange a]
rangeAlgebra = RangeMerge a -> [AnyRange a]
forall a. Eq a => RangeMerge a -> [AnyRange a]
exportRangeMerge (RangeMerge a -> [AnyRange a])
-> (RangeExprF [AnyRange a] -> RangeMerge a)
-> RangeExprF [AnyRange a]
-> [AnyRange 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 [AnyRange a] -> Free RangeExprF (RangeMerge a))
-> RangeExprF [AnyRange 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 [AnyRange a]
    -> RangeExprF (Free RangeExprF (RangeMerge a)))
-> RangeExprF [AnyRange a]
-> Free RangeExprF (RangeMerge a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([AnyRange a] -> Free RangeExprF (RangeMerge a))
-> RangeExprF [AnyRange 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))
-> ([AnyRange a] -> RangeMerge a)
-> [AnyRange a]
-> Free RangeExprF (RangeMerge a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyRange a] -> RangeMerge a
forall a (c :: (* -> *) -> Constraint).
Ord a =>
[AnyRangeFor c a] -> RangeMerge a
loadRanges)