relational-query-0.8.3.5: src/Database/Relational/Query/Internal/SQL.hs
{-# LANGUAGE FlexibleInstances #-}
-- |
-- Module : Database.Relational.Query.Internal.SQL
-- Copyright : 2014-2017 Kei Hibino
-- License : BSD3
--
-- Maintainer : ex8k.hibino@gmail.com
-- Stability : experimental
-- Portability : unknown
--
-- This module provides SQL string wrap interfaces.
module Database.Relational.Query.Internal.SQL (
StringSQL, stringSQL, showStringSQL,
rowStringSQL, rowPlaceHolderStringSQL,
rowConsStringSQL, listStringSQL,
ColumnSQL, columnSQL, columnSQL', showsColumnSQL,
) where
import Language.SQL.Keyword (Keyword, word, wordShow, fold, (|*|), paren)
-- | String wrap type for SQL strings.
type StringSQL = Keyword
-- | 'StringSQL' from 'String'.
stringSQL :: String -> StringSQL
stringSQL = word
-- | 'StringSQL' to 'String'.
showStringSQL :: StringSQL -> String
showStringSQL = wordShow
-- | Row String of SQL values.
rowStringSQL :: [StringSQL] -> StringSQL
rowStringSQL = d where
d [] = error "Projection: no columns."
d [c] = c
d cs = paren $ fold (|*|) cs
-- | Place holder row String of SQL.
rowPlaceHolderStringSQL :: Int -> StringSQL
rowPlaceHolderStringSQL = rowStringSQL . (`replicate` stringSQL "?")
-- | List String of SQL.
rowConsStringSQL :: [StringSQL] -> StringSQL
rowConsStringSQL = paren . fold (|*|)
-- | List String of SQL.
listStringSQL :: [StringSQL] -> StringSQL
listStringSQL = paren . fold (|*|)
-- | Simple wrap type
newtype ColumnSQL' a = ColumnSQL a
instance Functor ColumnSQL' where
fmap f (ColumnSQL c) = ColumnSQL $ f c
-- | Column SQL string type
type ColumnSQL = ColumnSQL' StringSQL
-- | 'ColumnSQL' from string
columnSQL :: String -> ColumnSQL
columnSQL = columnSQL' . stringSQL
-- | 'ColumnSQL' from 'StringSQL'
columnSQL' :: StringSQL -> ColumnSQL
columnSQL' = ColumnSQL
-- | StringSQL from ColumnSQL
showsColumnSQL :: ColumnSQL -> StringSQL
showsColumnSQL (ColumnSQL c) = c
instance Show ColumnSQL where
show = showStringSQL . showsColumnSQL