{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PolyKinds #-}
--------------------------------------------------------------------------------
-- |
-- Module      : Typson.Esqueleto
-- Description : Provides the Esqueleto integration
-- Copyright   : (c) Aaron Allen, 2020
-- Maintainer  : Aaron Allen <aaronallen8455@gmail.com>
-- License     : BSD-style (see the file LICENSE)
-- Stability   : experimental
-- Portability : non-portable
--
--------------------------------------------------------------------------------
module Typson.Esqueleto
  ( jsonPath
  , NullableJSONB(..)
  , PostgreSqlJSON
  ) where

import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Types as Aeson
import           Data.Bifunctor (first)
import           Data.List (foldl')
import qualified Data.List.NonEmpty as NE
import qualified Data.Text as T
import qualified Database.Esqueleto as E
import qualified Database.Esqueleto.PostgreSQL.JSON as E
import qualified Database.Esqueleto.Internal.Internal as E
import           GHC.Generics (Generic)

import           Typson

-- | Use a type-safe JSON path as part of a query.
--
-- @
-- select . from $ \entity ->
--   pure . jsonPath (Proxy @("foo" :-> "bar")) fieldSchemaJ
--     $ entity ^. Field
-- @
jsonPath :: ( TypeAtPath o tree path ~ field
            , ReflectPath path
            , PostgreSqlJSON json
            )
         => proxy (path :: k) -- ^ A path proxy
         -> ObjectTree tree o -- ^ Typson schema
         -> E.SqlExpr (E.Value (json o)) -- ^ Column selector
         -> E.SqlExpr (E.Value (NullableJSONB field))
jsonPath :: proxy path
-> ObjectTree tree o
-> SqlExpr (Value (json o))
-> SqlExpr (Value (NullableJSONB field))
jsonPath path :: proxy path
path _ input :: SqlExpr (Value (json o))
input =
  case proxy path -> NonEmpty PathComponent
forall k (path :: k) (proxy :: k -> *).
ReflectPath path =>
proxy path -> NonEmpty PathComponent
reflectPath proxy path
path of
    p :: PathComponent
p NE.:| ps :: [PathComponent]
ps -> (SqlExpr (Value (NullableJSONB field))
 -> PathComponent -> SqlExpr (Value (NullableJSONB field)))
-> SqlExpr (Value (NullableJSONB field))
-> [PathComponent]
-> SqlExpr (Value (NullableJSONB field))
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' SqlExpr (Value (NullableJSONB field))
-> PathComponent -> SqlExpr (Value (NullableJSONB field))
forall a c. SqlExpr (Value a) -> PathComponent -> SqlExpr (Value c)
buildPath (SqlExpr (Value (json o))
-> PathComponent -> SqlExpr (Value (NullableJSONB field))
forall a c. SqlExpr (Value a) -> PathComponent -> SqlExpr (Value c)
buildPath SqlExpr (Value (json o))
input PathComponent
p) [PathComponent]
ps
  where
    buildPath :: SqlExpr (Value a) -> PathComponent -> SqlExpr (Value c)
buildPath p :: SqlExpr (Value a)
p (Key k :: String
k) = SqlExpr (Value a)
p SqlExpr (Value a) -> SqlExpr (Value String) -> SqlExpr (Value c)
forall a b c.
SqlExpr (Value a) -> SqlExpr (Value b) -> SqlExpr (Value c)
`arrOp` String -> SqlExpr (Value String)
forall typ. PersistField typ => typ -> SqlExpr (Value typ)
E.val String
k
    buildPath p :: SqlExpr (Value a)
p (Idx i :: Integer
i) = SqlExpr (Value a)
p SqlExpr (Value a) -> SqlExpr (Value Int) -> SqlExpr (Value c)
forall a b c.
SqlExpr (Value a) -> SqlExpr (Value b) -> SqlExpr (Value c)
`arrOp` Int -> SqlExpr (Value Int)
forall typ. PersistField typ => typ -> SqlExpr (Value typ)
E.val (Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
i :: Int)
    arrOp :: SqlExpr (Value a) -> SqlExpr (Value b) -> SqlExpr (Value c)
arrOp = Builder
-> SqlExpr (Value a) -> SqlExpr (Value b) -> SqlExpr (Value c)
forall a b c.
Builder
-> SqlExpr (Value a) -> SqlExpr (Value b) -> SqlExpr (Value c)
E.unsafeSqlBinOp " -> "

-- | Treats SQL @NULL@ as a JSON @null@
newtype NullableJSONB a =
  NullableJSONB
    { NullableJSONB a -> a
unNullableJSONB :: a
    } deriving ( (forall x. NullableJSONB a -> Rep (NullableJSONB a) x)
-> (forall x. Rep (NullableJSONB a) x -> NullableJSONB a)
-> Generic (NullableJSONB a)
forall x. Rep (NullableJSONB a) x -> NullableJSONB a
forall x. NullableJSONB a -> Rep (NullableJSONB a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (NullableJSONB a) x -> NullableJSONB a
forall a x. NullableJSONB a -> Rep (NullableJSONB a) x
$cto :: forall a x. Rep (NullableJSONB a) x -> NullableJSONB a
$cfrom :: forall a x. NullableJSONB a -> Rep (NullableJSONB a) x
Generic
               , Value -> Parser [NullableJSONB a]
Value -> Parser (NullableJSONB a)
(Value -> Parser (NullableJSONB a))
-> (Value -> Parser [NullableJSONB a])
-> FromJSON (NullableJSONB a)
forall a. FromJSON a => Value -> Parser [NullableJSONB a]
forall a. FromJSON a => Value -> Parser (NullableJSONB a)
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [NullableJSONB a]
$cparseJSONList :: forall a. FromJSON a => Value -> Parser [NullableJSONB a]
parseJSON :: Value -> Parser (NullableJSONB a)
$cparseJSON :: forall a. FromJSON a => Value -> Parser (NullableJSONB a)
Aeson.FromJSON
               , [NullableJSONB a] -> Encoding
[NullableJSONB a] -> Value
NullableJSONB a -> Encoding
NullableJSONB a -> Value
(NullableJSONB a -> Value)
-> (NullableJSONB a -> Encoding)
-> ([NullableJSONB a] -> Value)
-> ([NullableJSONB a] -> Encoding)
-> ToJSON (NullableJSONB a)
forall a. ToJSON a => [NullableJSONB a] -> Encoding
forall a. ToJSON a => [NullableJSONB a] -> Value
forall a. ToJSON a => NullableJSONB a -> Encoding
forall a. ToJSON a => NullableJSONB a -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [NullableJSONB a] -> Encoding
$ctoEncodingList :: forall a. ToJSON a => [NullableJSONB a] -> Encoding
toJSONList :: [NullableJSONB a] -> Value
$ctoJSONList :: forall a. ToJSON a => [NullableJSONB a] -> Value
toEncoding :: NullableJSONB a -> Encoding
$ctoEncoding :: forall a. ToJSON a => NullableJSONB a -> Encoding
toJSON :: NullableJSONB a -> Value
$ctoJSON :: forall a. ToJSON a => NullableJSONB a -> Value
Aeson.ToJSON
               , NullableJSONB a -> Bool
(a -> m) -> NullableJSONB a -> m
(a -> b -> b) -> b -> NullableJSONB a -> b
(forall m. Monoid m => NullableJSONB m -> m)
-> (forall m a. Monoid m => (a -> m) -> NullableJSONB a -> m)
-> (forall m a. Monoid m => (a -> m) -> NullableJSONB a -> m)
-> (forall a b. (a -> b -> b) -> b -> NullableJSONB a -> b)
-> (forall a b. (a -> b -> b) -> b -> NullableJSONB a -> b)
-> (forall b a. (b -> a -> b) -> b -> NullableJSONB a -> b)
-> (forall b a. (b -> a -> b) -> b -> NullableJSONB a -> b)
-> (forall a. (a -> a -> a) -> NullableJSONB a -> a)
-> (forall a. (a -> a -> a) -> NullableJSONB a -> a)
-> (forall a. NullableJSONB a -> [a])
-> (forall a. NullableJSONB a -> Bool)
-> (forall a. NullableJSONB a -> Int)
-> (forall a. Eq a => a -> NullableJSONB a -> Bool)
-> (forall a. Ord a => NullableJSONB a -> a)
-> (forall a. Ord a => NullableJSONB a -> a)
-> (forall a. Num a => NullableJSONB a -> a)
-> (forall a. Num a => NullableJSONB a -> a)
-> Foldable NullableJSONB
forall a. Eq a => a -> NullableJSONB a -> Bool
forall a. Num a => NullableJSONB a -> a
forall a. Ord a => NullableJSONB a -> a
forall m. Monoid m => NullableJSONB m -> m
forall a. NullableJSONB a -> Bool
forall a. NullableJSONB a -> Int
forall a. NullableJSONB a -> [a]
forall a. (a -> a -> a) -> NullableJSONB a -> a
forall m a. Monoid m => (a -> m) -> NullableJSONB a -> m
forall b a. (b -> a -> b) -> b -> NullableJSONB a -> b
forall a b. (a -> b -> b) -> b -> NullableJSONB a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: NullableJSONB a -> a
$cproduct :: forall a. Num a => NullableJSONB a -> a
sum :: NullableJSONB a -> a
$csum :: forall a. Num a => NullableJSONB a -> a
minimum :: NullableJSONB a -> a
$cminimum :: forall a. Ord a => NullableJSONB a -> a
maximum :: NullableJSONB a -> a
$cmaximum :: forall a. Ord a => NullableJSONB a -> a
elem :: a -> NullableJSONB a -> Bool
$celem :: forall a. Eq a => a -> NullableJSONB a -> Bool
length :: NullableJSONB a -> Int
$clength :: forall a. NullableJSONB a -> Int
null :: NullableJSONB a -> Bool
$cnull :: forall a. NullableJSONB a -> Bool
toList :: NullableJSONB a -> [a]
$ctoList :: forall a. NullableJSONB a -> [a]
foldl1 :: (a -> a -> a) -> NullableJSONB a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> NullableJSONB a -> a
foldr1 :: (a -> a -> a) -> NullableJSONB a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> NullableJSONB a -> a
foldl' :: (b -> a -> b) -> b -> NullableJSONB a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> NullableJSONB a -> b
foldl :: (b -> a -> b) -> b -> NullableJSONB a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> NullableJSONB a -> b
foldr' :: (a -> b -> b) -> b -> NullableJSONB a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> NullableJSONB a -> b
foldr :: (a -> b -> b) -> b -> NullableJSONB a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> NullableJSONB a -> b
foldMap' :: (a -> m) -> NullableJSONB a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> NullableJSONB a -> m
foldMap :: (a -> m) -> NullableJSONB a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> NullableJSONB a -> m
fold :: NullableJSONB m -> m
$cfold :: forall m. Monoid m => NullableJSONB m -> m
Foldable
               , a -> NullableJSONB b -> NullableJSONB a
(a -> b) -> NullableJSONB a -> NullableJSONB b
(forall a b. (a -> b) -> NullableJSONB a -> NullableJSONB b)
-> (forall a b. a -> NullableJSONB b -> NullableJSONB a)
-> Functor NullableJSONB
forall a b. a -> NullableJSONB b -> NullableJSONB a
forall a b. (a -> b) -> NullableJSONB a -> NullableJSONB b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> NullableJSONB b -> NullableJSONB a
$c<$ :: forall a b. a -> NullableJSONB b -> NullableJSONB a
fmap :: (a -> b) -> NullableJSONB a -> NullableJSONB b
$cfmap :: forall a b. (a -> b) -> NullableJSONB a -> NullableJSONB b
Functor
               , NullableJSONB a -> NullableJSONB a -> Bool
(NullableJSONB a -> NullableJSONB a -> Bool)
-> (NullableJSONB a -> NullableJSONB a -> Bool)
-> Eq (NullableJSONB a)
forall a. Eq a => NullableJSONB a -> NullableJSONB a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NullableJSONB a -> NullableJSONB a -> Bool
$c/= :: forall a. Eq a => NullableJSONB a -> NullableJSONB a -> Bool
== :: NullableJSONB a -> NullableJSONB a -> Bool
$c== :: forall a. Eq a => NullableJSONB a -> NullableJSONB a -> Bool
Eq
               , Eq (NullableJSONB a)
Eq (NullableJSONB a) =>
(NullableJSONB a -> NullableJSONB a -> Ordering)
-> (NullableJSONB a -> NullableJSONB a -> Bool)
-> (NullableJSONB a -> NullableJSONB a -> Bool)
-> (NullableJSONB a -> NullableJSONB a -> Bool)
-> (NullableJSONB a -> NullableJSONB a -> Bool)
-> (NullableJSONB a -> NullableJSONB a -> NullableJSONB a)
-> (NullableJSONB a -> NullableJSONB a -> NullableJSONB a)
-> Ord (NullableJSONB a)
NullableJSONB a -> NullableJSONB a -> Bool
NullableJSONB a -> NullableJSONB a -> Ordering
NullableJSONB a -> NullableJSONB a -> NullableJSONB a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (NullableJSONB a)
forall a. Ord a => NullableJSONB a -> NullableJSONB a -> Bool
forall a. Ord a => NullableJSONB a -> NullableJSONB a -> Ordering
forall a.
Ord a =>
NullableJSONB a -> NullableJSONB a -> NullableJSONB a
min :: NullableJSONB a -> NullableJSONB a -> NullableJSONB a
$cmin :: forall a.
Ord a =>
NullableJSONB a -> NullableJSONB a -> NullableJSONB a
max :: NullableJSONB a -> NullableJSONB a -> NullableJSONB a
$cmax :: forall a.
Ord a =>
NullableJSONB a -> NullableJSONB a -> NullableJSONB a
>= :: NullableJSONB a -> NullableJSONB a -> Bool
$c>= :: forall a. Ord a => NullableJSONB a -> NullableJSONB a -> Bool
> :: NullableJSONB a -> NullableJSONB a -> Bool
$c> :: forall a. Ord a => NullableJSONB a -> NullableJSONB a -> Bool
<= :: NullableJSONB a -> NullableJSONB a -> Bool
$c<= :: forall a. Ord a => NullableJSONB a -> NullableJSONB a -> Bool
< :: NullableJSONB a -> NullableJSONB a -> Bool
$c< :: forall a. Ord a => NullableJSONB a -> NullableJSONB a -> Bool
compare :: NullableJSONB a -> NullableJSONB a -> Ordering
$ccompare :: forall a. Ord a => NullableJSONB a -> NullableJSONB a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (NullableJSONB a)
Ord
               , ReadPrec [NullableJSONB a]
ReadPrec (NullableJSONB a)
Int -> ReadS (NullableJSONB a)
ReadS [NullableJSONB a]
(Int -> ReadS (NullableJSONB a))
-> ReadS [NullableJSONB a]
-> ReadPrec (NullableJSONB a)
-> ReadPrec [NullableJSONB a]
-> Read (NullableJSONB a)
forall a. Read a => ReadPrec [NullableJSONB a]
forall a. Read a => ReadPrec (NullableJSONB a)
forall a. Read a => Int -> ReadS (NullableJSONB a)
forall a. Read a => ReadS [NullableJSONB a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [NullableJSONB a]
$creadListPrec :: forall a. Read a => ReadPrec [NullableJSONB a]
readPrec :: ReadPrec (NullableJSONB a)
$creadPrec :: forall a. Read a => ReadPrec (NullableJSONB a)
readList :: ReadS [NullableJSONB a]
$creadList :: forall a. Read a => ReadS [NullableJSONB a]
readsPrec :: Int -> ReadS (NullableJSONB a)
$creadsPrec :: forall a. Read a => Int -> ReadS (NullableJSONB a)
Read
               , Int -> NullableJSONB a -> ShowS
[NullableJSONB a] -> ShowS
NullableJSONB a -> String
(Int -> NullableJSONB a -> ShowS)
-> (NullableJSONB a -> String)
-> ([NullableJSONB a] -> ShowS)
-> Show (NullableJSONB a)
forall a. Show a => Int -> NullableJSONB a -> ShowS
forall a. Show a => [NullableJSONB a] -> ShowS
forall a. Show a => NullableJSONB a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NullableJSONB a] -> ShowS
$cshowList :: forall a. Show a => [NullableJSONB a] -> ShowS
show :: NullableJSONB a -> String
$cshow :: forall a. Show a => NullableJSONB a -> String
showsPrec :: Int -> NullableJSONB a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> NullableJSONB a -> ShowS
Show
               , Functor NullableJSONB
Foldable NullableJSONB
(Functor NullableJSONB, Foldable NullableJSONB) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> NullableJSONB a -> f (NullableJSONB b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    NullableJSONB (f a) -> f (NullableJSONB a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> NullableJSONB a -> m (NullableJSONB b))
-> (forall (m :: * -> *) a.
    Monad m =>
    NullableJSONB (m a) -> m (NullableJSONB a))
-> Traversable NullableJSONB
(a -> f b) -> NullableJSONB a -> f (NullableJSONB b)
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
NullableJSONB (m a) -> m (NullableJSONB a)
forall (f :: * -> *) a.
Applicative f =>
NullableJSONB (f a) -> f (NullableJSONB a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> NullableJSONB a -> m (NullableJSONB b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> NullableJSONB a -> f (NullableJSONB b)
sequence :: NullableJSONB (m a) -> m (NullableJSONB a)
$csequence :: forall (m :: * -> *) a.
Monad m =>
NullableJSONB (m a) -> m (NullableJSONB a)
mapM :: (a -> m b) -> NullableJSONB a -> m (NullableJSONB b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> NullableJSONB a -> m (NullableJSONB b)
sequenceA :: NullableJSONB (f a) -> f (NullableJSONB a)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
NullableJSONB (f a) -> f (NullableJSONB a)
traverse :: (a -> f b) -> NullableJSONB a -> f (NullableJSONB b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> NullableJSONB a -> f (NullableJSONB b)
$cp2Traversable :: Foldable NullableJSONB
$cp1Traversable :: Functor NullableJSONB
Traversable
               )
      deriving PersistField (NullableJSONB a)
Proxy (NullableJSONB a) -> SqlType
PersistField (NullableJSONB a) =>
(Proxy (NullableJSONB a) -> SqlType)
-> PersistFieldSql (NullableJSONB a)
forall a. (FromJSON a, ToJSON a) => PersistField (NullableJSONB a)
forall a.
(FromJSON a, ToJSON a) =>
Proxy (NullableJSONB a) -> SqlType
forall a.
PersistField a =>
(Proxy a -> SqlType) -> PersistFieldSql a
sqlType :: Proxy (NullableJSONB a) -> SqlType
$csqlType :: forall a.
(FromJSON a, ToJSON a) =>
Proxy (NullableJSONB a) -> SqlType
$cp1PersistFieldSql :: forall a. (FromJSON a, ToJSON a) => PersistField (NullableJSONB a)
E.PersistFieldSql via (E.JSONB a)

instance (Aeson.FromJSON a, Aeson.ToJSON a)
      => E.PersistField (NullableJSONB a) where
  toPersistValue :: NullableJSONB a -> PersistValue
toPersistValue = JSONB a -> PersistValue
forall a. PersistField a => a -> PersistValue
E.toPersistValue (JSONB a -> PersistValue)
-> (NullableJSONB a -> JSONB a) -> NullableJSONB a -> PersistValue
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> JSONB a
forall a. a -> JSONB a
E.JSONB (a -> JSONB a)
-> (NullableJSONB a -> a) -> NullableJSONB a -> JSONB a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NullableJSONB a -> a
forall a. NullableJSONB a -> a
unNullableJSONB
  fromPersistValue :: PersistValue -> Either Text (NullableJSONB a)
fromPersistValue pVal :: PersistValue
pVal = (a -> NullableJSONB a)
-> Either Text a -> Either Text (NullableJSONB a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> NullableJSONB a
forall a. a -> NullableJSONB a
NullableJSONB (Either Text a -> Either Text (NullableJSONB a))
-> Either Text a -> Either Text (NullableJSONB a)
forall a b. (a -> b) -> a -> b
$ case PersistValue
pVal of
      E.PersistNull -> (String -> Text) -> Either String a -> Either Text a
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first String -> Text
T.pack
                     (Either String a -> Either Text a)
-> Either String a -> Either Text a
forall a b. (a -> b) -> a -> b
$ (Value -> Parser a) -> Value -> Either String a
forall a b. (a -> Parser b) -> a -> Either String b
Aeson.parseEither Value -> Parser a
forall a. FromJSON a => Value -> Parser a
Aeson.parseJSON Value
Aeson.Null
      _ -> JSONB a -> a
forall a. JSONB a -> a
E.unJSONB (JSONB a -> a) -> Either Text (JSONB a) -> Either Text a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PersistValue -> Either Text (JSONB a)
forall a. PersistField a => PersistValue -> Either Text a
E.fromPersistValue PersistValue
pVal

-- | Members of this class are type constructors used to respresent
-- Postgres JSON columns.
class PostgreSqlJSON (json :: * -> *)
instance PostgreSqlJSON NullableJSONB
instance PostgreSqlJSON E.JSONB