packages feed

rel8-internal-1.8.0.0: src/Rel8/Internal/Expr/Range.hs

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Rel8.Internal.Expr.Range (
  range,  
  multirange,
) where

-- rel8
import Rel8.Internal.Data.Range (
  Range, mapRange, quoteRange,
  Multirange, primMultirange,
 )
import Rel8.Internal.Expr (Expr)
import Rel8.Internal.Expr.Opaleye (fromPrimExpr, toPrimExpr)
import Rel8.Internal.Type.Range (DBRange, rangeTypeName, multirangeTypeName)


range :: forall a. DBRange a => Range (Expr a) -> Expr (Range a)
range = fromPrimExpr . quoteRange name . mapRange toPrimExpr
  where
    name = rangeTypeName @a


multirange :: forall a. DBRange a => [Expr (Range a)] -> Expr (Multirange a)
multirange = fromPrimExpr . primMultirange name . map toPrimExpr
  where
    name = multirangeTypeName @a