{-# LANGUAGE TemplateHaskell, QuasiQuotes, RankNTypes #-}

-- |
-- Module:     Database.PostgreSQL.Store.OIDs
-- Copyright:  (c) Ole Krüger 2016
-- License:    BSD3
-- Maintainer: Ole Krüger <ole@vprsm.de>
module Database.PostgreSQL.Store.OIDs (
	OIDQ,

	bool,
	int2,
	int4,
	int8,
	float4,
	float8,
	numeric,
	char,
	varchar,
	text,
	bytea,
	timestamp,
	timestamptz
) where

import           Language.Haskell.TH
import qualified Database.PostgreSQL.LibPQ as P

class GenOID a where
	genOID :: Integer -> Q a

instance GenOID Exp where
	genOID oid = [e| P.Oid $(litE (IntegerL oid)) |]

instance GenOID Pat where
	genOID oid = [p| P.Oid $(pure (LitP (IntegerL oid))) |]

-- | A type which can be coerced into @Q Exp@ or @Q Pat@.
type OIDQ = forall a . GenOID a => Q a

-- | Boolean
bool :: OIDQ
bool = genOID 16

-- | 16-bit integer
int2 :: OIDQ
int2 = genOID 21

-- | 32-bit integer
int4 :: OIDQ
int4 = genOID 23

-- | 64-bit integer
int8 :: OIDQ
int8 = genOID 20

-- | Single-precision floating-point number
float4 :: OIDQ
float4 = genOID 700

-- | Double-precision floating-point number
float8 :: OIDQ
float8 = genOID 701

-- | Arbitrary precision number
numeric :: OIDQ
numeric = genOID 1700

-- | Fixed-length string
char :: OIDQ
char    = genOID 1042

-- | Variable-length string
varchar :: OIDQ
varchar = genOID 1043

-- | Unlimited variable-length string
text :: OIDQ
text = genOID 25

-- | Byte array
bytea :: OIDQ
bytea = genOID 17

-- | Timestamp without timezone
timestamp :: OIDQ
timestamp = genOID 1114

-- | Timestamp with timezone
timestamptz :: OIDQ
timestamptz = genOID 1184