Nicer 'from' interface.

Instead of

  select $ do
    (x,y,z) <- from
    where_ (z^.f ==. y^.f)
    return (x, y^.f, z)

now you may write

  select $
  from $ \(x,y,z) -> do
    where_ (z^.f ==. y^.f)
    return (x, y^.f, z)

Now the only difference in reading order wrt. SQL is the return
on the bottom of the expression. =)

Note that this does not change at all the expressivity of the
language since

  oldFrom = from return
This commit is contained in:
Felipe Lessa 2012-09-03 17:03:07 -03:00
parent 5bdac55e90
commit 2986d0996e

View File

@ -56,7 +56,6 @@ infixr 3 &&.
infixr 2 ||. infixr 2 ||.
class Esqueleto query expr backend => From query expr backend a where
-- | @FROM@ clause: bring an entity into scope. -- | @FROM@ clause: bring an entity into scope.
-- --
-- The following types implement 'from': -- The following types implement 'from':
@ -70,31 +69,36 @@ class Esqueleto query expr backend => From query expr backend a where
-- Note that using 'from' for the same entity twice does work -- Note that using 'from' for the same entity twice does work
-- and corresponds to a self-join. You don't even need to use -- and corresponds to a self-join. You don't even need to use
-- two different calls to 'from', you may use a tuple. -- two different calls to 'from', you may use a tuple.
from :: query a from :: From query expr backend a => (a -> query b) -> query b
from = (from_ >>=)
class Esqueleto query expr backend => From query expr backend a where
from_ :: query a
instance ( Esqueleto query expr backend instance ( Esqueleto query expr backend
, PersistEntity val , PersistEntity val
, PersistEntityBackend val ~ backend , PersistEntityBackend val ~ backend
) => From query expr backend (expr (Entity val)) where ) => From query expr backend (expr (Entity val)) where
from = fromSingle from_ = fromSingle
instance ( From query expr backend a instance ( From query expr backend a
, From query expr backend b , From query expr backend b
) => From query expr backend (a, b) where ) => From query expr backend (a, b) where
from = (,) <$> from <*> from from_ = (,) <$> from_ <*> from_
instance ( From query expr backend a instance ( From query expr backend a
, From query expr backend b , From query expr backend b
, From query expr backend c , From query expr backend c
) => From query expr backend (a, b, c) where ) => From query expr backend (a, b, c) where
from = (,,) <$> from <*> from <*> from from_ = (,,) <$> from_ <*> from_ <*> from_
instance ( From query expr backend a instance ( From query expr backend a
, From query expr backend b , From query expr backend b
, From query expr backend c , From query expr backend c
, From query expr backend d , From query expr backend d
) => From query expr backend (a, b, c, d) where ) => From query expr backend (a, b, c, d) where
from = (,,,) <$> from <*> from <*> from <*> from from_ = (,,,) <$> from_ <*> from_ <*> from_ <*> from_
instance ( From query expr backend a instance ( From query expr backend a
, From query expr backend b , From query expr backend b
@ -102,7 +106,7 @@ instance ( From query expr backend a
, From query expr backend d , From query expr backend d
, From query expr backend e , From query expr backend e
) => From query expr backend (a, b, c, d, e) where ) => From query expr backend (a, b, c, d, e) where
from = (,,,,) <$> from <*> from <*> from <*> from <*> from from_ = (,,,,) <$> from_ <*> from_ <*> from_ <*> from_ <*> from_
instance ( From query expr backend a instance ( From query expr backend a
, From query expr backend b , From query expr backend b
@ -111,7 +115,7 @@ instance ( From query expr backend a
, From query expr backend e , From query expr backend e
, From query expr backend f , From query expr backend f
) => From query expr backend (a, b, c, d, e, f) where ) => From query expr backend (a, b, c, d, e, f) where
from = (,,,,,) <$> from <*> from <*> from <*> from <*> from <*> from from_ = (,,,,,) <$> from_ <*> from_ <*> from_ <*> from_ <*> from_ <*> from_
instance ( From query expr backend a instance ( From query expr backend a
, From query expr backend b , From query expr backend b
@ -121,7 +125,7 @@ instance ( From query expr backend a
, From query expr backend f , From query expr backend f
, From query expr backend g , From query expr backend g
) => From query expr backend (a, b, c, d, e, f, g) where ) => From query expr backend (a, b, c, d, e, f, g) where
from = (,,,,,,) <$> from <*> from <*> from <*> from <*> from <*> from <*> from from_ = (,,,,,,) <$> from_ <*> from_ <*> from_ <*> from_ <*> from_ <*> from_ <*> from_
instance ( From query expr backend a instance ( From query expr backend a
, From query expr backend b , From query expr backend b
@ -132,4 +136,4 @@ instance ( From query expr backend a
, From query expr backend g , From query expr backend g
, From query expr backend h , From query expr backend h
) => From query expr backend (a, b, c, d, e, f, g, h) where ) => From query expr backend (a, b, c, d, e, f, g, h) where
from = (,,,,,,,) <$> from <*> from <*> from <*> from <*> from <*> from <*> from <*> from from_ = (,,,,,,,) <$> from_ <*> from_ <*> from_ <*> from_ <*> from_ <*> from_ <*> from_ <*> from_