packages feed

rel8-1.7.0.0: src/Rel8/Expr/NonEmpty.hs

{-# language FlexibleContexts #-}
{-# language MonoLocalBinds #-}

module Rel8.Expr.NonEmpty (
  head1Expr,
  index1Expr,
  last1Expr,
  shead1Expr,
  sindex1Expr,
  slast1Expr,
  length1Expr,
) where

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

-- rel8
import Rel8.Expr (Expr)
import Rel8.Expr.Opaleye (mapPrimExpr, toPrimExpr)
import Rel8.Schema.Null (Nullify, Sql, Unnullify)
import Rel8.Type (DBType, typeInformation)
import Rel8.Type.Information (TypeInformation)
import qualified Rel8.Type.Array as Prim


head1Expr :: Sql DBType a => Expr (NonEmpty a) -> Expr a
head1Expr = shead1Expr typeInformation


index1Expr :: Sql DBType a => Expr Int32 -> Expr (NonEmpty a) -> Expr (Nullify a)
index1Expr = sindex1Expr typeInformation


last1Expr :: Sql DBType a => Expr (NonEmpty a) -> Expr a
last1Expr = slast1Expr typeInformation


shead1Expr :: TypeInformation (Unnullify a) -> Expr (NonEmpty a) -> Expr a
shead1Expr info = mapPrimExpr (Prim.head info)


sindex1Expr :: TypeInformation (Unnullify a) -> Expr Int32 -> Expr (NonEmpty a) -> Expr (Nullify a)
sindex1Expr info i = mapPrimExpr (Prim.index info (toPrimExpr i))


slast1Expr :: TypeInformation (Unnullify a) -> Expr (NonEmpty a) -> Expr a
slast1Expr info = mapPrimExpr (Prim.last info)


length1Expr :: Expr (NonEmpty a) -> Expr Int32
length1Expr = mapPrimExpr (Prim.length)