On Sat, Nov 24, 2012 at 12:07 PM, Erik de Castro Lopo <mle+hs@mega-nerd.com> wrote:
Hi all,

Below my .sig is a little Persist/Esqueleto program that works correctly.

The getUserCount function does thr right thing and returns the number of
rows in the User table. However, what I'd like is a generic function
that returns the row count of any table, something vaguely like this:


    queryRowCount :: tableType -> SqlPersist IO Int64
    queryRowCount tableName = do
        [Value x] <- select . from $ \(_ :: SqlExpr (Entity tableName)) ->
                        return countRows
        return x


Is there any way to do this? Its probably possible in Agda, but can it
be made to work with GHC?

How about something like this:

    {-# LANGUAGE ScopedTypeVariables #-}

    queryRowCount :: forall tableType. Proxy tableType -> SqlPersist IO Int64
    queryRowCount _ = do
        [Value x] <- select . from $ \(_ :: SqlExpr (Entity tableType)) ->
                        return countRows
        return x

The Proxy type is defined as:

  data Proxy a = Proxy

You can use the 'tagged' package to get it.

ScopedTypeVariables and the explicit forall are needed to make sure the type 'tableType' from the top level signature is the same as the one used later.

Erik