{-# 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]
[Keyword]
ws sepBy' :: [Keyword] -> Keyword -> [String]
`sepBy'` Keyword
d = forall a b. (a -> b) -> [a] -> [b]
map Keyword -> String
wordShow forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> [a] -> [a]
intersperse Keyword
d forall a b. (a -> b) -> a -> b
$ [Keyword]
ws
unwords' :: [Keyword] -> Keyword
unwords' :: [Keyword] -> Keyword
unwords' = forall a. Monoid a => [a] -> a
mconcat
concatStr :: [String] -> Keyword
concatStr :: [String] -> Keyword
concatStr = String -> Keyword
word forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
sepBy :: [Keyword] -> Keyword -> Keyword
[Keyword]
ws sepBy :: [Keyword] -> Keyword -> Keyword
`sepBy` Keyword
d = [String] -> Keyword
concatStr forall a b. (a -> b) -> a -> b
$ [Keyword]
ws [Keyword] -> Keyword -> [String]
`sepBy'` Keyword
d
parenSepBy :: [Keyword] -> Keyword -> Keyword
[Keyword]
ws parenSepBy :: [Keyword] -> Keyword -> Keyword
`parenSepBy` Keyword
d = [String] -> Keyword
concatStr forall a b. (a -> b) -> a -> b
$ String
"(" forall a. a -> [a] -> [a]
: ([Keyword]
ws [Keyword] -> Keyword -> [String]
`sepBy'` Keyword
d) forall a. [a] -> [a] -> [a]
++ [String
")"]
(<++>) :: Keyword -> Keyword -> Keyword
Keyword
x <++> :: Keyword -> Keyword -> Keyword
<++> Keyword
y = DString -> Keyword
fromDString forall a b. (a -> b) -> a -> b
$ Keyword -> DString
toDString Keyword
x forall a. Semigroup a => a -> a -> a
<> Keyword -> DString
toDString Keyword
y
concat' :: [Keyword] -> Keyword
concat' :: [Keyword] -> Keyword
concat' = DString -> Keyword
fromDString forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Monoid a => [a] -> a
mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map Keyword -> DString
toDString
defineBinOp' :: Keyword -> Keyword -> Keyword -> Keyword
defineBinOp' :: Keyword -> Keyword -> Keyword -> Keyword
defineBinOp' Keyword
op Keyword
a Keyword
b = [Keyword] -> Keyword
concat' [Keyword
a, Keyword
op, Keyword
b]
defineBinOp :: Keyword -> Keyword -> Keyword -> Keyword
defineBinOp :: Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
op Keyword
a Keyword
b = 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 -> Keyword
defineBinOp' Keyword
", "
(.||.) :: Keyword -> Keyword -> Keyword
.||. :: Keyword -> Keyword -> Keyword
(.||.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
"||"
(.=.) :: Keyword -> Keyword -> Keyword
.=. :: Keyword -> Keyword -> Keyword
(.=.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
"="
(.<>.) :: Keyword -> Keyword -> Keyword
.<>. :: Keyword -> Keyword -> Keyword
(.<>.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
"<>"
(.<.) :: Keyword -> Keyword -> Keyword
.<. :: Keyword -> Keyword -> Keyword
(.<.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
"<"
(.<=.) :: Keyword -> Keyword -> Keyword
.<=. :: Keyword -> Keyword -> Keyword
(.<=.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
"<="
(.>.) :: Keyword -> Keyword -> Keyword
.>. :: Keyword -> Keyword -> Keyword
(.>.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
">"
(.>=.) :: Keyword -> Keyword -> Keyword
.>=. :: Keyword -> Keyword -> Keyword
(.>=.) = Keyword -> Keyword -> Keyword -> Keyword
defineBinOp Keyword
">="
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 Keyword -> Keyword -> Keyword
op = [Keyword] -> Keyword
d where
d :: [Keyword] -> Keyword
d [] = forall a. Monoid a => a
mempty
d xs :: [Keyword]
xs@(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 Keyword
op Keyword
e = forall a. Monoid a => [a] -> a
mconcat [Keyword
op, Keyword
e]
paren :: Keyword -> Keyword
paren :: Keyword -> Keyword
paren Keyword
w = [Keyword] -> Keyword
concat' [Keyword
"(", Keyword
w, Keyword
")"]
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 Keyword -> Keyword
u = Keyword -> String
wordShow forall b c a. (b -> c) -> (a -> b) -> a -> c
. Keyword -> Keyword
u 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 Keyword -> Keyword -> Keyword
op String
a String
b = Keyword -> String
wordShow forall a b. (a -> b) -> a -> b
$ Keyword -> Keyword -> Keyword
op (String -> Keyword
word String
a) (String -> Keyword
word String
b)