diff --git a/changelog.d/20250701_105439_shane.obrien_elem.md b/changelog.d/20250701_105439_shane.obrien_elem.md new file mode 100644 index 00000000..d59d0cf9 --- /dev/null +++ b/changelog.d/20250701_105439_shane.obrien_elem.md @@ -0,0 +1,3 @@ +### Added + +- Add `elem` and `elem1` to `Rel8.Array` for testing if an element is contained in `[]` and `NonEmpty` `Expr`s. diff --git a/src/Rel8/Array.hs b/src/Rel8/Array.hs index ad602c61..d8447945 100644 --- a/src/Rel8/Array.hs +++ b/src/Rel8/Array.hs @@ -1,3 +1,7 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE MonoLocalBinds #-} +{-# LANGUAGE OverloadedStrings #-} + module Rel8.Array ( -- ** @ListTable@ @@ -6,6 +10,7 @@ module Rel8.Array , index, indexExpr , last, lastExpr , length, lengthExpr + , elem -- ** @NonEmptyTable@ , NonEmptyTable @@ -13,6 +18,7 @@ module Rel8.Array , index1, index1Expr , last1, last1Expr , length1, length1Expr + , elem1 -- ** Unsafe , unsafeSubscript @@ -21,11 +27,34 @@ module Rel8.Array where -- base -import Prelude hiding (head, last, length) +import Data.List.NonEmpty (NonEmpty) +import Prelude hiding (elem, head, last, length) -- rel8 +import Rel8.Expr (Expr) +import Rel8.Expr.Array (listOf, nonEmptyOf) +import Rel8.Expr.Function (rawBinaryOperator) import Rel8.Expr.List import Rel8.Expr.NonEmpty import Rel8.Expr.Subscript +import Rel8.Schema.Null (Sql) import Rel8.Table.List import Rel8.Table.NonEmpty +import Rel8.Type.Eq (DBEq) + + +-- | @'elem' a as@ tests whether @a@ is an element of the list @as@. +elem :: Sql DBEq a => Expr a -> Expr [a] -> Expr Bool +elem = (<@) . listOf . pure + where + (<@) = rawBinaryOperator "<@" +infix 4 `elem` + + +-- | @'elem1' a as@ tests whether @a@ is an element of the non-empty list +-- @as@. +elem1 :: Sql DBEq a => Expr a -> Expr (NonEmpty a) -> Expr Bool +elem1 = (<@) . nonEmptyOf . pure + where + (<@) = rawBinaryOperator "<@" +infix 4 `elem1`