packages feed

rel8-1.0.0.0: src/Rel8/Expr/Array.hs

{-# language DataKinds #-}
{-# language FlexibleContexts #-}
{-# language TypeFamilies #-}

{-# options_ghc -fno-warn-redundant-constraints #-}

module Rel8.Expr.Array
  ( listOf, nonEmptyOf
  , slistOf, snonEmptyOf
  , sappend, sappend1, sempty
  )
where

-- base
import Data.List.NonEmpty ( NonEmpty )
import Prelude

-- opaleye
import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye

-- rel8
import {-# SOURCE #-} Rel8.Expr ( Expr )
import Rel8.Expr.Opaleye
  ( fromPrimExpr, toPrimExpr
  , zipPrimExprsWith
  )
import Rel8.Type ( DBType, typeInformation )
import Rel8.Type.Array ( array )
import Rel8.Type.Information ( TypeInformation(..) )
import Rel8.Schema.Null ( Unnullify, Sql )


sappend :: Expr [a] -> Expr [a] -> Expr [a]
sappend = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))


sappend1 :: Expr (NonEmpty a) -> Expr (NonEmpty a) -> Expr (NonEmpty a)
sappend1 = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))


sempty :: TypeInformation (Unnullify a) -> Expr [a]
sempty info = fromPrimExpr $ array info []


slistOf :: TypeInformation (Unnullify a) -> [Expr a] -> Expr [a]
slistOf info = fromPrimExpr . array info . fmap toPrimExpr


snonEmptyOf :: TypeInformation (Unnullify a) -> NonEmpty (Expr a) -> Expr (NonEmpty a)
snonEmptyOf info = fromPrimExpr . array info . fmap toPrimExpr


listOf :: Sql DBType a => [Expr a] -> Expr [a]
listOf = slistOf typeInformation


nonEmptyOf :: Sql DBType a => NonEmpty (Expr a) -> Expr (NonEmpty a)
nonEmptyOf = snonEmptyOf typeInformation