Use fundeps on SqlSelect.

This allows GHC to infer the type of from by the return of
select.
This commit is contained in:
Felipe Lessa 2012-09-03 16:26:02 -03:00
parent 33d04d5f27
commit b189791dc3

View File

@ -1,4 +1,4 @@
{-# LANGUAGE ConstraintKinds, MultiParamTypeClasses, TypeFamilies, FlexibleContexts, GADTs, OverloadedStrings #-} {-# LANGUAGE ConstraintKinds, MultiParamTypeClasses, FunctionalDependencies, FlexibleContexts, FlexibleInstances, UndecidableInstances, GADTs, OverloadedStrings #-}
module Database.Esqueleto.Internal.Sql module Database.Esqueleto.Internal.Sql
( SqlQuery ( SqlQuery
, select , select
@ -138,11 +138,11 @@ binop op (ERaw f1) (ERaw f2) = ERaw f
-- | TODO -- | TODO
select :: ( SqlSelect a select :: ( SqlSelect a r
, RawSql (SqlSelectRet r) , RawSql r
, MonadLogger m , MonadLogger m
, MonadResourceBase m) , MonadResourceBase m)
=> SqlQuery a -> SqlPersist m [SqlSelectRet r] => SqlQuery a -> SqlPersist m [r]
select query = do select query = do
conn <- getConnection conn <- getConnection
uncurry rawSql $ uncurry rawSql $
@ -156,7 +156,7 @@ getConnection = SqlPersist R.ask
-- | Pretty prints a 'SqlQuery' into a SQL query. -- | Pretty prints a 'SqlQuery' into a SQL query.
toRawSelectSql :: SqlSelect a => Escape -> SqlQuery a -> (TLB.Builder, [PersistValue]) toRawSelectSql :: SqlSelect a r => Escape -> SqlQuery a -> (TLB.Builder, [PersistValue])
toRawSelectSql esc query = toRawSelectSql esc query =
let (ret, SideData fromClauses whereClauses) = let (ret, SideData fromClauses whereClauses) =
flip S.evalSupply (idents ()) $ flip S.evalSupply (idents ()) $
@ -176,41 +176,37 @@ toRawSelectSql esc query =
in (text, selectVars <> whereVars) in (text, selectVars <> whereVars)
class RawSql (SqlSelectRet a) => SqlSelect a where class RawSql r => SqlSelect a r | a -> r, r -> a where
type SqlSelectRet a :: *
makeSelect :: Escape -> a -> (TLB.Builder, [PersistValue]) makeSelect :: Escape -> a -> (TLB.Builder, [PersistValue])
instance RawSql a => SqlSelect (SqlExpr a) where instance PersistEntity a => SqlSelect (SqlExpr (Entity a)) (Entity a) where
type SqlSelectRet (SqlExpr a) = a makeSelect _ (EEntity _) = ("??", mempty)
makeSelect _ (EEntity _) = ("??", mempty) instance PersistField a => SqlSelect (SqlExpr (Single a)) (Single a) where
makeSelect esc (ERaw f) = first parens (f esc) makeSelect esc (ERaw f) = first parens (f esc)
instance (SqlSelect a, SqlSelect b) => SqlSelect (a, b) where instance ( SqlSelect a ra
type SqlSelectRet (a, b) = (SqlSelectRet a, SqlSelectRet b) , SqlSelect b rb
makeSelect esc (a, b) = uncommas' [makeSelect esc a, makeSelect esc b] ) => SqlSelect (a, b) (ra, rb) where
instance (SqlSelect a, SqlSelect b, SqlSelect c) => SqlSelect (a, b, c) where makeSelect esc (a, b) =
type SqlSelectRet (a, b, c) = uncommas'
( SqlSelectRet a [ makeSelect esc a
, SqlSelectRet b , makeSelect esc b
, SqlSelectRet c ]
) instance ( SqlSelect a ra
, SqlSelect b rb
, SqlSelect c rc
) => SqlSelect (a, b, c) (ra, rb, rc) where
makeSelect esc (a, b, c) = makeSelect esc (a, b, c) =
uncommas' uncommas'
[ makeSelect esc a [ makeSelect esc a
, makeSelect esc b , makeSelect esc b
, makeSelect esc c , makeSelect esc c
] ]
instance ( SqlSelect a instance ( SqlSelect a ra
, SqlSelect b , SqlSelect b rb
, SqlSelect c , SqlSelect c rc
, SqlSelect d , SqlSelect d rd
) => SqlSelect (a, b, c, d) where ) => SqlSelect (a, b, c, d) (ra, rb, rc, rd) where
type SqlSelectRet (a, b, c, d) =
( SqlSelectRet a
, SqlSelectRet b
, SqlSelectRet c
, SqlSelectRet d
)
makeSelect esc (a, b, c, d) = makeSelect esc (a, b, c, d) =
uncommas' uncommas'
[ makeSelect esc a [ makeSelect esc a
@ -218,19 +214,12 @@ instance ( SqlSelect a
, makeSelect esc c , makeSelect esc c
, makeSelect esc d , makeSelect esc d
] ]
instance ( SqlSelect a instance ( SqlSelect a ra
, SqlSelect b , SqlSelect b rb
, SqlSelect c , SqlSelect c rc
, SqlSelect d , SqlSelect d rd
, SqlSelect e , SqlSelect e re
) => SqlSelect (a, b, c, d, e) where ) => SqlSelect (a, b, c, d, e) (ra, rb, rc, rd, re) where
type SqlSelectRet (a, b, c, d, e) =
( SqlSelectRet a
, SqlSelectRet b
, SqlSelectRet c
, SqlSelectRet d
, SqlSelectRet e
)
makeSelect esc (a, b, c, d, e) = makeSelect esc (a, b, c, d, e) =
uncommas' uncommas'
[ makeSelect esc a [ makeSelect esc a
@ -239,21 +228,13 @@ instance ( SqlSelect a
, makeSelect esc d , makeSelect esc d
, makeSelect esc e , makeSelect esc e
] ]
instance ( SqlSelect a instance ( SqlSelect a ra
, SqlSelect b , SqlSelect b rb
, SqlSelect c , SqlSelect c rc
, SqlSelect d , SqlSelect d rd
, SqlSelect e , SqlSelect e re
, SqlSelect f , SqlSelect f rf
) => SqlSelect (a, b, c, d, e, f) where ) => SqlSelect (a, b, c, d, e, f) (ra, rb, rc, rd, re, rf) where
type SqlSelectRet (a, b, c, d, e, f) =
( SqlSelectRet a
, SqlSelectRet b
, SqlSelectRet c
, SqlSelectRet d
, SqlSelectRet e
, SqlSelectRet f
)
makeSelect esc (a, b, c, d, e, f) = makeSelect esc (a, b, c, d, e, f) =
uncommas' uncommas'
[ makeSelect esc a [ makeSelect esc a
@ -263,23 +244,14 @@ instance ( SqlSelect a
, makeSelect esc e , makeSelect esc e
, makeSelect esc f , makeSelect esc f
] ]
instance ( SqlSelect a instance ( SqlSelect a ra
, SqlSelect b , SqlSelect b rb
, SqlSelect c , SqlSelect c rc
, SqlSelect d , SqlSelect d rd
, SqlSelect e , SqlSelect e re
, SqlSelect f , SqlSelect f rf
, SqlSelect g , SqlSelect g rg
) => SqlSelect (a, b, c, d, e, f, g) where ) => SqlSelect (a, b, c, d, e, f, g) (ra, rb, rc, rd, re, rf, rg) where
type SqlSelectRet (a, b, c, d, e, f, g) =
( SqlSelectRet a
, SqlSelectRet b
, SqlSelectRet c
, SqlSelectRet d
, SqlSelectRet e
, SqlSelectRet f
, SqlSelectRet g
)
makeSelect esc (a, b, c, d, e, f, g) = makeSelect esc (a, b, c, d, e, f, g) =
uncommas' uncommas'
[ makeSelect esc a [ makeSelect esc a
@ -290,25 +262,15 @@ instance ( SqlSelect a
, makeSelect esc f , makeSelect esc f
, makeSelect esc g , makeSelect esc g
] ]
instance ( SqlSelect a instance ( SqlSelect a ra
, SqlSelect b , SqlSelect b rb
, SqlSelect c , SqlSelect c rc
, SqlSelect d , SqlSelect d rd
, SqlSelect e , SqlSelect e re
, SqlSelect f , SqlSelect f rf
, SqlSelect g , SqlSelect g rg
, SqlSelect h , SqlSelect h rh
) => SqlSelect (a, b, c, d, e, f, g, h) where ) => SqlSelect (a, b, c, d, e, f, g, h) (ra, rb, rc, rd, re, rf, rg, rh) where
type SqlSelectRet (a, b, c, d, e, f, g, h) =
( SqlSelectRet a
, SqlSelectRet b
, SqlSelectRet c
, SqlSelectRet d
, SqlSelectRet e
, SqlSelectRet f
, SqlSelectRet g
, SqlSelectRet h
)
makeSelect esc (a, b, c, d, e, f, g, h) = makeSelect esc (a, b, c, d, e, f, g, h) =
uncommas' uncommas'
[ makeSelect esc a [ makeSelect esc a