DSH-0.5: Database Supported Haskell

Database.DSH

Contents

Description

This module is intended to be imported qualified, to avoid name clashes with Prelude functions. For example:

 import qualified Database.DSH as Q
 import Database.DSH (Q)

Alternatively you can hide Prelude and import this module like this:

 import Prelude ()
 import Database.DSH

In this case you still get Prelude definitions that are not provided by Database.DSH.

Synopsis

Unit

Boolean logic

Equality and Ordering

eq :: (Eq a, QA a) => Q a -> Q a -> Q BoolSource

(==) :: (Eq a, QA a) => Q a -> Q a -> Q BoolSource

neq :: (Eq a, QA a) => Q a -> Q a -> Q BoolSource

(/=) :: (Eq a, QA a) => Q a -> Q a -> Q BoolSource

lt :: (Ord a, QA a) => Q a -> Q a -> Q BoolSource

(<) :: (Ord a, QA a) => Q a -> Q a -> Q BoolSource

lte :: (Ord a, QA a) => Q a -> Q a -> Q BoolSource

(<=) :: (Ord a, QA a) => Q a -> Q a -> Q BoolSource

gte :: (Ord a, QA a) => Q a -> Q a -> Q BoolSource

(>=) :: (Ord a, QA a) => Q a -> Q a -> Q BoolSource

gt :: (Ord a, QA a) => Q a -> Q a -> Q BoolSource

(>) :: (Ord a, QA a) => Q a -> Q a -> Q BoolSource

min :: forall a. (Ord a, QA a) => Q a -> Q a -> Q aSource

max :: forall a. (Ord a, QA a) => Q a -> Q a -> Q aSource

Conditionals

bool :: QA a => Q a -> Q a -> Q Bool -> Q aSource

Boolean fold | It's first argument is used in the case of False | It's second argument is used in the case of True | The third argument is the boolean

cond :: forall a. QA a => Q Bool -> Q a -> Q a -> Q aSource

(?) :: QA a => Q Bool -> (Q a, Q a) -> Q aSource

List Construction

nil :: forall a. QA a => Q [a]Source

empty :: QA a => Q [a]Source

cons :: forall a. QA a => Q a -> Q [a] -> Q [a]Source

(<|) :: QA a => Q a -> Q [a] -> Q [a]Source

snoc :: forall a. QA a => Q [a] -> Q a -> Q [a]Source

(|>) :: QA a => Q [a] -> Q a -> Q [a]Source

singleton :: QA a => Q a -> Q [a]Source

List Operations

head :: forall a. QA a => Q [a] -> Q aSource

tail :: forall a. QA a => Q [a] -> Q [a]Source

take :: forall a. QA a => Q Integer -> Q [a] -> Q [a]Source

drop :: forall a. QA a => Q Integer -> Q [a] -> Q [a]Source

map :: forall a b. (QA a, QA b) => (Q a -> Q b) -> Q [a] -> Q [b]Source

append :: forall a. QA a => Q [a] -> Q [a] -> Q [a]Source

(><) :: QA a => Q [a] -> Q [a] -> Q [a]Source

filter :: forall a. QA a => (Q a -> Q Bool) -> Q [a] -> Q [a]Source

groupWith :: forall a b. (Ord b, QA a, QA b) => (Q a -> Q b) -> Q [a] -> Q [[a]]Source

sortWith :: forall a b. (Ord b, QA a, QA b) => (Q a -> Q b) -> Q [a] -> Q [a]Source

the :: forall a. (Eq a, QA a) => Q [a] -> Q aSource

last :: forall a. QA a => Q [a] -> Q aSource

init :: forall a. QA a => Q [a] -> Q [a]Source

null :: QA a => Q [a] -> Q BoolSource

length :: QA a => Q [a] -> Q IntegerSource

index :: forall a. QA a => Q [a] -> Q Integer -> Q aSource

(!!) :: QA a => Q [a] -> Q Integer -> Q aSource

reverse :: forall a. QA a => Q [a] -> Q [a]Source

Special folds

or :: Q [Bool] -> Q BoolSource

any :: QA a => (Q a -> Q Bool) -> Q [a] -> Q BoolSource

all :: QA a => (Q a -> Q Bool) -> Q [a] -> Q BoolSource

sum :: forall a. (QA a, Num a) => Q [a] -> Q aSource

concat :: forall a. QA a => Q [[a]] -> Q [a]Source

concatMap :: (QA a, QA b) => (Q a -> Q [b]) -> Q [a] -> Q [b]Source

maximum :: forall a. (QA a, Ord a) => Q [a] -> Q aSource

minimum :: forall a. (QA a, Ord a) => Q [a] -> Q aSource

Sublists

splitAt :: forall a. QA a => Q Integer -> Q [a] -> Q ([a], [a])Source

takeWhile :: forall a. QA a => (Q a -> Q Bool) -> Q [a] -> Q [a]Source

dropWhile :: forall a. QA a => (Q a -> Q Bool) -> Q [a] -> Q [a]Source

span :: forall a. QA a => (Q a -> Q Bool) -> Q [a] -> Q ([a], [a])Source

break :: forall a. QA a => (Q a -> Q Bool) -> Q [a] -> Q ([a], [a])Source

Searching Lists

elem :: forall a. (Eq a, QA a) => Q a -> Q [a] -> Q BoolSource

notElem :: forall a. (Eq a, QA a) => Q a -> Q [a] -> Q BoolSource

Zipping and Unzipping Lists

zip :: forall a b. (QA a, QA b) => Q [a] -> Q [b] -> Q [(a, b)]Source

zipWith :: forall a b c. (QA a, QA b, QA c) => (Q a -> Q b -> Q c) -> Q [a] -> Q [b] -> Q [c]Source

unzip :: forall a b. (QA a, QA b) => Q [(a, b)] -> Q ([a], [b])Source

Set operations

nub :: forall a. (Eq a, QA a) => Q [a] -> Q [a]Source

Tuple Projection Functions

fst :: forall a b. (QA a, QA b) => Q (a, b) -> Q aSource

snd :: forall a b. (QA a, QA b) => Q (a, b) -> Q bSource

Conversions between numeric types

Convert Haskell values into DB queries

toQ :: forall a. QA a => a -> Q aSource

Missing Combinators

 

This module offers most of the functions on lists given in PreludeList for the Q type. Missing functions are:

General folds:

 foldl
 foldl1
 scanl
 scanl1
 foldr
 foldr1
 scanr
 scanr1

Infinit lists:

 iterate
 repeat
 cycle

String functions:

 lines
 words
 unlines
 unwords

Searching lists:

 lookup

Zipping and unzipping lists:

 zip3
 zipWith3
 unzip3

Data Types

data Q a Source

Instances

Typeable1 Q 
Eq (Q Double) 
Eq (Q Integer) 
Fractional (Q Double) 
Data a => Data (Q a) 
Num (Q Double) 
Num (Q Integer) 
Show (Q a) 
IsString (Q Text) 
View (Q Bool) (Q Bool) 
View (Q Char) (Q Char) 
View (Q Double) (Q Double) 
View (Q Integer) (Q Integer) 
View (Q ()) (Q ()) 
View (Q Text) (Q Text) 
(QA a, QA b) => View (Q (a, b)) (Q a, Q b) 
(QA a1, QA a2, QA a3) => View (Q (a1, a2, a3)) (Q a1, Q a2, Q a3) 
(QA a1, QA a2, QA a3, QA a4) => View (Q (a1, a2, a3, a4)) (Q a1, Q a2, Q a3, Q a4) 
(QA a1, QA a2, QA a3, QA a4, QA a5) => View (Q (a1, a2, a3, a4, a5)) (Q a1, Q a2, Q a3, Q a4, Q a5) 
(QA a1, QA a2, QA a3, QA a4, QA a5, QA a6) => View (Q (a1, a2, a3, a4, a5, a6)) (Q a1, Q a2, Q a3, Q a4, Q a5, Q a6) 
(QA a1, QA a2, QA a3, QA a4, QA a5, QA a6, QA a7) => View (Q (a1, a2, a3, a4, a5, a6, a7)) (Q a1, Q a2, Q a3, Q a4, Q a5, Q a6, Q a7) 
(QA a1, QA a2, QA a3, QA a4, QA a5, QA a6, QA a7, QA a8) => View (Q (a1, a2, a3, a4, a5, a6, a7, a8)) (Q a1, Q a2, Q a3, Q a4, Q a5, Q a6, Q a7, Q a8) 

Type Classes

class QA a Source

Instances

QA Bool 
QA Char 
QA Double 
QA Integer 
QA () 
QA Text 
QA a => QA [a] 
(QA a, QA b) => QA (a, b) 
(QA a1, QA a2, QA a3) => QA (a1, a2, a3) 
(QA a1, QA a2, QA a3, QA a4) => QA (a1, a2, a3, a4) 
(QA a1, QA a2, QA a3, QA a4, QA a5) => QA (a1, a2, a3, a4, a5) 
(QA a1, QA a2, QA a3, QA a4, QA a5, QA a6) => QA (a1, a2, a3, a4, a5, a6) 
(QA a1, QA a2, QA a3, QA a4, QA a5, QA a6, QA a7) => QA (a1, a2, a3, a4, a5, a6, a7) 
(QA a1, QA a2, QA a3, QA a4, QA a5, QA a6, QA a7, QA a8) => QA (a1, a2, a3, a4, a5, a6, a7, a8) 

class QA a => TA a Source

Instances

TA Bool 
TA Char 
TA Double 
TA Integer 
TA () 
TA Text 
(BasicType a, BasicType b, QA a, QA b) => TA (a, b) 
(QA a1, BasicType a1, QA a2, BasicType a2, QA a3, BasicType a3) => TA (a1, a2, a3) 
(QA a1, BasicType a1, QA a2, BasicType a2, QA a3, BasicType a3, QA a4, BasicType a4) => TA (a1, a2, a3, a4) 
(QA a1, BasicType a1, QA a2, BasicType a2, QA a3, BasicType a3, QA a4, BasicType a4, QA a5, BasicType a5) => TA (a1, a2, a3, a4, a5) 
(QA a1, BasicType a1, QA a2, BasicType a2, QA a3, BasicType a3, QA a4, BasicType a4, QA a5, BasicType a5, QA a6, BasicType a6) => TA (a1, a2, a3, a4, a5, a6) 
(QA a1, BasicType a1, QA a2, BasicType a2, QA a3, BasicType a3, QA a4, BasicType a4, QA a5, BasicType a5, QA a6, BasicType a6, QA a7, BasicType a7) => TA (a1, a2, a3, a4, a5, a6, a7) 
(QA a1, BasicType a1, QA a2, BasicType a2, QA a3, BasicType a3, QA a4, BasicType a4, QA a5, BasicType a5, QA a6, BasicType a6, QA a7, BasicType a7, QA a8, BasicType a8) => TA (a1, a2, a3, a4, a5, a6, a7, a8) 

table :: TA a => String -> Q [a]Source

tableDB :: TA a => String -> Q [a]Source

tableCSV :: TA a => String -> Q [a]Source

tableWithKeys :: TA a => String -> [[String]] -> Q [a]Source

class View a b | a -> b, b -> a whereSource

Methods

view :: a -> bSource

fromView :: b -> aSource

Instances

View (Q Bool) (Q Bool) 
View (Q Char) (Q Char) 
View (Q Double) (Q Double) 
View (Q Integer) (Q Integer) 
View (Q ()) (Q ()) 
View (Q Text) (Q Text) 
(QA a, QA b) => View (Q (a, b)) (Q a, Q b) 
(QA a1, QA a2, QA a3) => View (Q (a1, a2, a3)) (Q a1, Q a2, Q a3) 
(QA a1, QA a2, QA a3, QA a4) => View (Q (a1, a2, a3, a4)) (Q a1, Q a2, Q a3, Q a4) 
(QA a1, QA a2, QA a3, QA a4, QA a5) => View (Q (a1, a2, a3, a4, a5)) (Q a1, Q a2, Q a3, Q a4, Q a5) 
(QA a1, QA a2, QA a3, QA a4, QA a5, QA a6) => View (Q (a1, a2, a3, a4, a5, a6)) (Q a1, Q a2, Q a3, Q a4, Q a5, Q a6) 
(QA a1, QA a2, QA a3, QA a4, QA a5, QA a6, QA a7) => View (Q (a1, a2, a3, a4, a5, a6, a7)) (Q a1, Q a2, Q a3, Q a4, Q a5, Q a6, Q a7) 
(QA a1, QA a2, QA a3, QA a4, QA a5, QA a6, QA a7, QA a8) => View (Q (a1, a2, a3, a4, a5, a6, a7, a8)) (Q a1, Q a2, Q a3, Q a4, Q a5, Q a6, Q a7, Q a8) 

tuple :: View a b => b -> aSource

record :: View a b => b -> aSource

Quasiquoter

Template Haskell: Creating Table Representations

generateRecordsSource

Arguments

:: IConnection conn 
=> IO conn

Database connection

-> String

Table name

-> String

Data type name for each row of the table

-> [Name]

Default deriving instances

-> Q [Dec] 

Lookup a database table, create corresponding Haskell record data types and generate QA and View instances

Example usage:

 $(generateRecords myConnection "users" "User" [''Show,''Eq])

Note that the da is created at compile time, not at run time!

generateInstances :: Q [Dec] -> Q [Dec]Source

Derive QA and View instances for record definitions

Example usage:

 $(generateInstances [d|

     data User = User
         { userId    :: Int
         , userName  :: String
         }

   |])

This generates the following record type, which can be used in view patterns

 data UserV = UserV
     { userIdV    :: Q Int
     , userNameV  :: Q String
     }
 instance View (Q User) UserV

and the liftet record selectors:

 userIdQ      :: Q User -> Q Int
 userNameQ    :: Q User -> Q String

csvImport :: FilePath -> Type -> IO NormSource

csvExport :: TA a => FilePath -> [a] -> IO ()Source

module Data.Text

module Prelude