-- SPDX-License-Identifier: MPL-2.0

{- |
Copyright   :  (c) 2024-2025 Sayo contributors
License     :  MPL-2.0 (see the LICENSE file)
Maintainer  :  ymdfield@outlook.jp

This module provides handlers for the t`KVStore` effect, comes
from [@Polysemy.KVStore@](https://hackage.haskell.org/package/polysemy-kvstore-0.1.3.0/docs/Polysemy-KVStore.html)
in the @polysemy-kvstore@ package.
-}
module Control.Monad.Hefty.KVStore (
    module Control.Monad.Hefty.KVStore,
    module Data.Effect.KVStore,
)
where

import Control.Arrow ((>>>))
import Control.Monad.Hefty (Eff, FOEs, raiseUnder)
import Control.Monad.Hefty.State (runState)
import Data.Effect.KVStore
import Data.Map (Map)

runKVStoreCC
    :: forall k v a es
     . (Ord k, FOEs es)
    => Map k v
    -> Eff (KVStore k v ': es) a
    -> Eff es (Map k v, a)
runKVStoreCC :: forall k v a (es :: [Effect]).
(Ord k, FOEs es) =>
Map k v -> Eff (KVStore k v : es) a -> Eff es (Map k v, a)
runKVStoreCC Map k v
initial =
    Eff (KVStore k v : es) a
-> Eff Freer (KVStore k v : State (Map k v) : es) a
forall (e0 :: Effect) (e1 :: Effect) (es :: [Effect]) a
       (ff :: Effect) (c :: (* -> *) -> Constraint).
Free c ff =>
Eff ff (e0 : es) a -> Eff ff (e0 : e1 : es) a
raiseUnder
        (Eff (KVStore k v : es) a
 -> Eff Freer (KVStore k v : State (Map k v) : es) a)
-> (Eff Freer (KVStore k v : State (Map k v) : es) a
    -> Eff es (Map k v, a))
-> Eff (KVStore k v : es) a
-> Eff es (Map k v, a)
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> Eff Freer (KVStore k v : State (Map k v) : es) a
-> Eff Freer (State (Map k v) : es) a
Eff Freer (KVStore k v : State (Map k v) : es)
~> Eff Freer (State (Map k v) : es)
forall k v (es :: [Effect]) (ff :: Effect)
       (c :: (* -> *) -> Constraint).
(Ord k, State (Map k v) :> es, Monad (Eff ff es), Free c ff) =>
Eff ff (KVStore k v : es) ~> Eff ff es
runKVStoreAsState
        (Eff Freer (KVStore k v : State (Map k v) : es) a
 -> Eff Freer (State (Map k v) : es) a)
-> (Eff Freer (State (Map k v) : es) a -> Eff es (Map k v, a))
-> Eff Freer (KVStore k v : State (Map k v) : es) a
-> Eff es (Map k v, a)
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> Map k v
-> Eff Freer (State (Map k v) : es) a -> Eff es (Map k v, a)
forall s (es :: [Effect]) a.
FOEs es =>
s -> Eff (State s : es) a -> Eff es (s, a)
runState Map k v
initial
{-# INLINE runKVStoreCC #-}