prowdsponsor / esqueleto

Bare bones, type-safe EDSL for SQL queries on persistent backends.
http://hackage.haskell.org/package/esqueleto
BSD 3-Clause "New" or "Revised" License
177 stars 51 forks source link

Expose SqlSelect so it can be used in type signatures #160

Open googleson78 opened 4 years ago

googleson78 commented 4 years ago

I currently have two very similar sql queries, different in only their return type. (one returns a tuple and has a limit, while the other returns count(*) with no limit)

I would like to create a function

f ::
  SqlSelect a r =>
  (... -> SqlQuery a) ->
  ReaderT SqlBackend IO [r]

to factour out the similarities by passing in an f :: ... -> SqlQuery a function which determines the return type of the query. However to give a type to this I have to use SqlSelect, which is in an internal module.

Would it be possible to somehow expose it for this purpose, or should I just use the Internal module in this case? (or is there some other solution that I just missed)

googleson78 commented 4 years ago

(for anyone wondering the same thing)

There is also another idea that works: In my original post I was trying to use a select directly to implement f.

Instead of trying to generalise the select statement, I generalised the from part only, which worked out fine.

The new type of my f is

f ::
  (... -> SqlQuery b) ->
  SqlQuery b

and I later use it with

select $
  f <provide functions here that have access to the from statement in f>

The only duplicated part is now the select, which is a very minor annoyance.