@hackage / bluefin-opaleye

bluefin support for high-level PostgreSQL operations via Opaleye.

Latest0.1.0.0

About

Metadata

  • Last updated , by fpringle
  • License BSD-3-Clause
  • Categories Databases
  • Maintained by: frederick.pringle@fpringle.com

  • Lottery factor: 1

Links

Installation

Tested Compilers

  1. 9.10.2
  2. 9.8.2
  3. 9.6.7
  4. 9.6.1
  5. 9.4.5
  6. 9.4.2
  7. 9.2.8
  8. 9.2.4
  9. 9.0.2
  10. 8.10.7

Readme

bluefin-opaleye

This package provides a bluefin effect for Opaleye operations.

It combines the very safe, high-level syntax of Opaleye, with the WithConnection abstraction of bluefin-postgresql.

Effectful functions

In the Opaleye effect we can perform the 4 main operations permitted by Opaleye: query, insert, delete, and update.

{-# LANGUAGE Arrows #-}
import Control.Arrow
import Bluefin.Opaleye as BO
import qualified Opaleye as O

insertAndList :: (e :> es) => Opaleye e -> Eff es [User]
insertAndList o = do
  BO.runInsert o $ O.Insert userTable [User {firstName = "Nuala"}] O.rCount Nothing

  BO.runDelete o $ O.Delete userTable isAdmin O.rCount

  BO.runUpdate o $ O.Update userTable (\user -> user {updatedAt = O.now}) isAdmin O.rCount

  BO.runSelect o $ proc () -> do
    user <- O.selectTable userTable -< ()
    O.restrict -< firstName user `O.in_` (O.toFields <$> ["Anna", "Boris", "Carla"])
    returnA -< user

Interpreters

To run the Opaleye effect we can use the WithConnection effect from bluefin-postgresql:

import Bluefin.Opaleye as BO

doOpaleyeStuff :: (e :> es) => WithConnection e -> IOE e -> Eff es [User]
doOpaleyeStuff wc ioe =
  BO.runOpaleyeWithConnection wc ioe $ \o -> insertAndList o

The WithConnection effect can then be dispatched using one of its interpreters. Or, to skip that entirely, we can just use runOpaleyeConnection:

doOpaleyeStuff :: (e :> es) => IOE e -> PSQL.Connection -> Eff es [User]
doOpaleyeStuff ioe conn = BO.runOpaleyeConnection ioe conn insertAndList