module Polysemy.Hasql.Interpreter.Reader where

import Polysemy.Db.Interpreter.Reader (interpretReaderStore)
import Sqel.Data.QuerySchema (emptyQuerySchema)
import Sqel.Data.TableSchema (TableSchema)

import Polysemy.Hasql.Effect.DbTable (DbTable)
import Polysemy.Hasql.Interpreter.Store (interpretQStoreDb)

-- |Interpret 'Reader' as a singleton table.
--
-- Given an initial value, every state action reads the value from the database, potentially writing it on first access.
interpretReaderDb ::
   d e r .
  Member (DbTable d !! e) r =>
  TableSchema d ->
  Sem r d ->
  InterpreterFor (Reader d !! e) r
interpretReaderDb :: forall d e (r :: EffectRow).
Member (DbTable d !! e) r =>
TableSchema d -> Sem r d -> InterpreterFor (Reader d !! e) r
interpretReaderDb TableSchema d
table Sem r d
initial =
  forall (f :: * -> *) q d e (r :: EffectRow).
(ResultShape d (f d), Member (DbTable d !! e) r) =>
TableSchema d
-> QuerySchema q d -> InterpreterFor (QStore f q d !! e) r
interpretQStoreDb @Maybe TableSchema d
table forall {k} (a :: k). QuerySchema () a
emptyQuerySchema forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall d e (r :: EffectRow).
Member (QStore Maybe () d !! e) r =>
Sem r d -> InterpreterFor (Reader d !! e) r
interpretReaderStore (forall (e :: Effect) (r :: EffectRow) a. Sem r a -> Sem (e : r) a
raise Sem r d
initial) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall (e2 :: Effect) (e1 :: Effect) (r :: EffectRow) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder