module Yesod.Session.Memcache.Yesod
  ( makeSessionBackend
  , SessionConfiguration (..)
  ) where

import Internal.Prelude

import Database.Memcache.Client qualified as Memcache
import Yesod.Core.Types (SessionBackend (..))
import Yesod.Session.Memcache.Storage
import Yesod.Session.Options
import Yesod.Session.Storage.Yesod
  ( SessionConfiguration' (..)
  , makeSessionBackend'
  )

data SessionConfiguration env = SessionConfiguration
  { forall {k} (env :: k).
SessionConfiguration env -> SessionPersistence
persistence :: SessionPersistence
  -- ^ Mapping between 'Yesod.Session.Persist.Session' and Memcache
  --   representation
  , forall {k} (env :: k). SessionConfiguration env -> Options IO IO
options :: Options IO IO
  -- ^ Various options that have defaults; see 'defaultOptions'
  }

-- | Use this to implement 'Yesod.Core.makeSessionBackend'.
makeSessionBackend
  :: SessionConfiguration Memcache.Client
  -> IO SessionBackend
makeSessionBackend :: SessionConfiguration Client -> IO SessionBackend
makeSessionBackend SessionConfiguration Client
configuration =
  case SessionPersistence
persistence of
    SessionPersistence {} ->
      SessionConfiguration' Any -> IO SessionBackend
forall {k} (session :: k).
SessionConfiguration' session -> IO SessionBackend
makeSessionBackend'
        SessionConfiguration'
          { $sel:storage:SessionConfiguration' :: forall a. StorageOperation a -> IO a
storage = SessionPersistence -> Options IO IO -> StorageOperation a -> IO a
forall (m :: * -> *) result.
(MonadThrow m, MonadIO m) =>
SessionPersistence
-> Options IO IO -> StorageOperation result -> m result
memcacheStorage SessionPersistence
persistence Options IO IO
options
          , $sel:options:SessionConfiguration' :: Options IO IO
options = Options IO IO
options
          , $sel:runDB:SessionConfiguration' :: forall a. IO a -> IO a
runDB = IO a -> IO a
forall a. a -> a
forall a. IO a -> IO a
id
          }
 where
  SessionConfiguration {SessionPersistence
$sel:persistence:SessionConfiguration :: forall {k} (env :: k).
SessionConfiguration env -> SessionPersistence
persistence :: SessionPersistence
persistence, Options IO IO
$sel:options:SessionConfiguration :: forall {k} (env :: k). SessionConfiguration env -> Options IO IO
options :: Options IO IO
options} = SessionConfiguration Client
configuration