{-# LANGUAGE OverloadedStrings #-}
module Language.SQL.Keyword.Concat (
unwords',
sepBy, parenSepBy,
defineBinOp,
strBinOp,
as, (<.>), (|*|),
(.||.),
(.=.), (.<.), (.<=.), (.>.), (.>=.), (.<>.),
and, or, in',
(<++>),
fold,
defineUniOp, paren,
strUniOp
) where
import Prelude hiding (and, or, not)
import Data.List (intersperse)
import Data.Monoid (mempty, mconcat, (<>))
import Language.SQL.Keyword.Internal.Type (Keyword (..), word, wordShow, toDString, fromDString)
sepBy' :: [Keyword] -> Keyword -> [String]
ws :: [Keyword]
ws sepBy' :: [Keyword] -> Keyword -> [String]
`sepBy'` d :: Keyword
d = (Keyword -> String) -> [Keyword] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Keyword -> String
wordShow ([Keyword] -> [String])
-> ([Keyword] -> [Keyword]) -> [Keyword] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Keyword -> [Keyword] -> [Keyword]
forall a. a -> [a] -> [a]
intersperse Keyword
d ([Keyword] -> [String]) -> [Keyword] -> [String]
forall a b. (a -> b) -> a -> b
$ [Keyword]
ws
unwords' :: [Keyword] -> Keyword
unwords' :: [Keyword] -> Keyword
unwords' = [Keyword] -> Keyword
forall a. Monoid a => [a] -> a
mconcat
concatStr :: [String] -> Keyword
concatStr :: [String] -> Keyword
concatStr = String -> Keyword
word (String -> Keyword) -> ([String] -> String) -> [String] -> Keyword
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
sepBy :: [Keyword] -> Keyword -> Keyword
ws :: [Keyword]
ws sepBy :: [Keyword] -> Keyword -> Keyword
`sepBy` d :: Keyword
d = [String] -> Keyword
concatStr ([String] -> Keyword) -> [String] -> Keyword
forall a b. (a -> b) -> a -> b
$ [Keyword]
ws [Keyword] -> Keyword -> [String]
`sepBy'` Keyword
d
parenSepBy :: [Keyword] -> Keyword -> Keyword
ws :: [Keyword]
ws parenSepBy :: [Keyword] -> Keyword -> Keyword
`parenSepBy` d :: Keyword
d = [String] -> Keyword
concatStr ([String] -> Keyword) -> [String] -> Keyword
forall a b. (a -> b) -> a -> b
$ "(" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: ([Keyword]
ws [Keyword] -> Keyword -> [String]
`sepBy'` Keyword
d) [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [")"]
(<++>) :: Keyword -> Keyword -> Keyword
x :: Keyword
x <++> :: Keyword -> Keyword -> Keyword
<++> y :: Keyword
y = DString -> Keyword
fromDString (DString -> Keyword) -> DString -> Keyword
forall a b. (a -> b) -> a -> b
$ Keyword -> DString
toDString Keyword
x DString -> DString -> DString
forall a. Semigroup a => a -> a -> a
<> Keyword -> DString
toDString Keyword
y
concat' :: [Keyword] -> Keyword
concat' :: [Keyword] -> Keyword
concat' = DString -> Keyword
fromDString (DString -> Keyword)
-> ([Keyword] -> DString) -> [Keyword] -> Keyword
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DString] -> DString
forall a. Monoid a => [a] -> a
mconcat ([DString] -> DString)
-> ([Keyword] -> [DString]) -> [Keyword] -> DString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Keyword -> DString) -> [Keyword] -> [DString]
forall a b. (a -> b) -> [a] -> [b]
map Keyword -> DString
toDString
defineBinOp' :: Keyword -> Keyword -> Keyword -> Keyword
defineBinOp' :: Keyword -> Keyword -> Keyword -> Keyword
defineBinOp' op :: Keyword
op a :: Keyword
a b :: Keyword
b = [Keyword] -> Keyword
concat' [Keyword
a, Keyword
op, Keyword
b]
defineBinOp :: Keyword -> Keyword -> Keyword -> Keyword
defineBinOp :: Keyword -> Keyword -> Keyword -> Keyword
defineBinOp op :: Keyword
op a :: Keyword
a b :: Keyword
b = [Keyword] -> Keyword
forall a. Monoid a => [a] -> a
mconcat [Keyword
a, Keyword
op, Keyword
b]
(<.>) :: Keyword -> Keyword -> Keyword
<.> :: Keyword -> Keyword -> Keyword
(<.>) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp' "."
(|*|) :: Keyword -> Keyword -> Keyword
|*| :: Keyword -> Keyword -> Keyword
(|*|) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp' ", "
(.||.) :: Keyword -> Keyword -> Keyword
.||. :: Keyword -> Keyword -> Keyword
(.||.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp "||"
(.=.) :: Keyword -> Keyword -> Keyword
.=. :: Keyword -> Keyword -> Keyword
(.=.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp "="
(.<>.) :: Keyword -> Keyword -> Keyword
.<>. :: Keyword -> Keyword -> Keyword
(.<>.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp "<>"
(.<.) :: Keyword -> Keyword -> Keyword
.<. :: Keyword -> Keyword -> Keyword
(.<.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp "<"
(.<=.) :: Keyword -> Keyword -> Keyword
.<=. :: Keyword -> Keyword -> Keyword
(.<=.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp "<="
(.>.) :: Keyword -> Keyword -> Keyword
.>. :: Keyword -> Keyword -> Keyword
(.>.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp ">"
(.>=.) :: Keyword -> Keyword -> Keyword
.>=. :: Keyword -> Keyword -> Keyword
(.>=.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp ">="
as :: Keyword -> Keyword -> Keyword
as :: Keyword -> Keyword -> Keyword
as = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
AS
and :: Keyword -> Keyword -> Keyword
and :: Keyword -> Keyword -> Keyword
and = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
AND
or :: Keyword -> Keyword -> Keyword
or :: Keyword -> Keyword -> Keyword
or = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
OR
fold :: (Keyword -> Keyword -> Keyword)
-> [Keyword]
-> Keyword
fold :: (Keyword -> Keyword -> Keyword) -> [Keyword] -> Keyword
fold op :: Keyword -> Keyword -> Keyword
op = [Keyword] -> Keyword
d where
d :: [Keyword] -> Keyword
d [] = Keyword
forall a. Monoid a => a
mempty
d xs :: [Keyword]
xs@(_:_) = (Keyword -> Keyword -> Keyword) -> [Keyword] -> Keyword
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 Keyword -> Keyword -> Keyword
op [Keyword]
xs
defineUniOp :: Keyword -> Keyword -> Keyword
defineUniOp :: Keyword -> Keyword -> Keyword
defineUniOp op :: Keyword
op e :: Keyword
e = [Keyword] -> Keyword
forall a. Monoid a => [a] -> a
mconcat [Keyword
op, Keyword
e]
paren :: Keyword -> Keyword
paren :: Keyword -> Keyword
paren w :: Keyword
w = [Keyword] -> Keyword
concat' ["(", Keyword
w, ")"]
in' :: Keyword -> Keyword -> Keyword
in' :: Keyword -> Keyword -> Keyword
in' = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
IN
infixr 6 <++>
infixr 5 .||.
infixr 4 .=., .<., .<=., .>., .>=., .<>.
infix 4 `in'`
infixr 3 `and`
infixr 2 `or`
infixr 1 |*|
strUniOp :: (Keyword -> Keyword) -> String -> String
strUniOp :: (Keyword -> Keyword) -> String -> String
strUniOp u :: Keyword -> Keyword
u = Keyword -> String
wordShow (Keyword -> String) -> (String -> Keyword) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Keyword -> Keyword
u (Keyword -> Keyword) -> (String -> Keyword) -> String -> Keyword
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Keyword
word
strBinOp :: (Keyword -> Keyword -> Keyword) -> String -> String -> String
strBinOp :: (Keyword -> Keyword -> Keyword) -> String -> String -> String
strBinOp op :: Keyword -> Keyword -> Keyword
op a :: String
a b :: String
b = Keyword -> String
wordShow (Keyword -> String) -> Keyword -> String
forall a b. (a -> b) -> a -> b
$ Keyword -> Keyword -> Keyword
op (String -> Keyword
word String
a) (String -> Keyword
word String
b)