module Polysemy.Hasql.Data.InitDb where

import Hasql.Connection (Connection)

newtype ClientTag =
  ClientTag { ClientTag -> Text
unInitTag :: Text }
  deriving stock (ClientTag -> ClientTag -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ClientTag -> ClientTag -> Bool
$c/= :: ClientTag -> ClientTag -> Bool
== :: ClientTag -> ClientTag -> Bool
$c== :: ClientTag -> ClientTag -> Bool
Eq, Int -> ClientTag -> ShowS
[ClientTag] -> ShowS
ClientTag -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ClientTag] -> ShowS
$cshowList :: [ClientTag] -> ShowS
show :: ClientTag -> String
$cshow :: ClientTag -> String
showsPrec :: Int -> ClientTag -> ShowS
$cshowsPrec :: Int -> ClientTag -> ShowS
Show, forall x. Rep ClientTag x -> ClientTag
forall x. ClientTag -> Rep ClientTag x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ClientTag x -> ClientTag
$cfrom :: forall x. ClientTag -> Rep ClientTag x
Generic)
  deriving newtype (String -> ClientTag
forall a. (String -> a) -> IsString a
fromString :: String -> ClientTag
$cfromString :: String -> ClientTag
IsString, Eq ClientTag
ClientTag -> ClientTag -> Bool
ClientTag -> ClientTag -> Ordering
ClientTag -> ClientTag -> ClientTag
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
min :: ClientTag -> ClientTag -> ClientTag
$cmin :: ClientTag -> ClientTag -> ClientTag
max :: ClientTag -> ClientTag -> ClientTag
$cmax :: ClientTag -> ClientTag -> ClientTag
>= :: ClientTag -> ClientTag -> Bool
$c>= :: ClientTag -> ClientTag -> Bool
> :: ClientTag -> ClientTag -> Bool
$c> :: ClientTag -> ClientTag -> Bool
<= :: ClientTag -> ClientTag -> Bool
$c<= :: ClientTag -> ClientTag -> Bool
< :: ClientTag -> ClientTag -> Bool
$c< :: ClientTag -> ClientTag -> Bool
compare :: ClientTag -> ClientTag -> Ordering
$ccompare :: ClientTag -> ClientTag -> Ordering
Ord)

data InitDb m =
  InitDb {
    forall (m :: * -> *). InitDb m -> ClientTag
tag :: ClientTag,
    forall (m :: * -> *). InitDb m -> Bool
once :: Bool,
    forall (m :: * -> *). InitDb m -> Connection -> m ()
thunk :: Connection -> m ()
  }
  deriving stock (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (m :: * -> *) x. Rep (InitDb m) x -> InitDb m
forall (m :: * -> *) x. InitDb m -> Rep (InitDb m) x
$cto :: forall (m :: * -> *) x. Rep (InitDb m) x -> InitDb m
$cfrom :: forall (m :: * -> *) x. InitDb m -> Rep (InitDb m) x
Generic)

instance Applicative m => Default (InitDb m) where
  def :: InitDb m
def =
    forall (m :: * -> *).
ClientTag -> Bool -> (Connection -> m ()) -> InitDb m
InitDb ClientTag
"global" Bool
True (forall a b. a -> b -> a
const forall (f :: * -> *). Applicative f => f ()
unit)

hoistInitDb :: (m () -> n ()) -> InitDb m -> InitDb n
hoistInitDb :: forall (m :: * -> *) (n :: * -> *).
(m () -> n ()) -> InitDb m -> InitDb n
hoistInitDb m () -> n ()
f (InitDb ClientTag
t Bool
o Connection -> m ()
th) =
  forall (m :: * -> *).
ClientTag -> Bool -> (Connection -> m ()) -> InitDb m
InitDb ClientTag
t Bool
o (m () -> n ()
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. Connection -> m ()
th)

raiseInitDb :: InitDb (Sem r) -> InitDb (Sem (e : r))
raiseInitDb :: forall (r :: EffectRow) (e :: Effect).
InitDb (Sem r) -> InitDb (Sem (e : r))
raiseInitDb =
  forall (m :: * -> *) (n :: * -> *).
(m () -> n ()) -> InitDb m -> InitDb n
hoistInitDb forall (e :: Effect) (r :: EffectRow) a. Sem r a -> Sem (e : r) a
raise