module PostgresqlSyntax.Predicate where

import qualified Data.HashSet as HashSet
import qualified PostgresqlSyntax.CharSet as CharSet
import qualified PostgresqlSyntax.KeywordSet as KeywordSet
import PostgresqlSyntax.Prelude hiding (expression)

-- * Generic

-- |
-- >>> test = oneOf [(==3), (==7), (==3), (==5)]
-- >>> test 1
-- False
--
-- >>> test 3
-- True
--
-- >>> test 5
-- True
oneOf :: [a -> Bool] -> a -> Bool
oneOf :: [a -> Bool] -> a -> Bool
oneOf = ((a -> Bool) -> (a -> Bool) -> a -> Bool)
-> (a -> Bool) -> [a -> Bool] -> a -> Bool
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\a -> Bool
a a -> Bool
b a
c -> a -> Bool
a a
c Bool -> Bool -> Bool
|| a -> Bool
b a
c) (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
False)

inSet :: (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet :: HashSet a -> a -> Bool
inSet = (a -> HashSet a -> Bool) -> HashSet a -> a -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> HashSet a -> Bool
forall a. (Eq a, Hashable a) => a -> HashSet a -> Bool
HashSet.member

-- *

hexDigit :: Char -> Bool
hexDigit = HashSet Char -> Char -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet HashSet Char
CharSet.hexDigit

-- *

{-
ident_start   [A-Za-z\200-\377_]
-}
firstIdentifierChar :: Char -> Bool
firstIdentifierChar :: Char -> Bool
firstIdentifierChar Char
x = Char -> Bool
isAlpha Char
x Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'\200' Bool -> Bool -> Bool
&& Char
x Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'\377'

{-
ident_cont    [A-Za-z\200-\377_0-9\$]
-}
notFirstIdentifierChar :: Char -> Bool
notFirstIdentifierChar :: Char -> Bool
notFirstIdentifierChar Char
x = Char -> Bool
isAlphaNum Char
x Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'$' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'\200' Bool -> Bool -> Bool
&& Char
x Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'\377'

keyword :: Text -> Bool
keyword :: Text -> Bool
keyword = HashSet Text -> Text -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet HashSet Text
KeywordSet.keyword

unreservedKeyword :: Text -> Bool
unreservedKeyword :: Text -> Bool
unreservedKeyword = HashSet Text -> Text -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet HashSet Text
KeywordSet.unreservedKeyword

colNameKeyword :: Text -> Bool
colNameKeyword :: Text -> Bool
colNameKeyword = HashSet Text -> Text -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet HashSet Text
KeywordSet.colNameKeyword

typeFuncNameKeyword :: Text -> Bool
typeFuncNameKeyword :: Text -> Bool
typeFuncNameKeyword = HashSet Text -> Text -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet HashSet Text
KeywordSet.typeFuncNameKeyword

reservedKeyword :: Text -> Bool
reservedKeyword :: Text -> Bool
reservedKeyword = HashSet Text -> Text -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet HashSet Text
KeywordSet.reservedKeyword

{-# NOINLINE symbolicBinOpChar #-}
symbolicBinOpChar :: Char -> Bool
symbolicBinOpChar :: Char -> Bool
symbolicBinOpChar = HashSet Char -> Char -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet HashSet Char
CharSet.symbolicBinOp

-- ** Op chars

opChar :: Char -> Bool
opChar = HashSet Char -> Char -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet HashSet Char
CharSet.op

prohibitedOpChar :: Char -> Bool
prohibitedOpChar Char
a = Char
a Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'+' Bool -> Bool -> Bool
|| Char
a Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'-'

prohibitionLiftingOpChar :: Char -> Bool
prohibitionLiftingOpChar = HashSet Char -> Char -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
inSet HashSet Char
CharSet.prohibitionLiftingOp