module Yesod.Session.Storage.Operation
  ( StorageOperation (..)
  , StorageOperation' (..)
  ) where

import Internal.Prelude

import Session.Key
import Yesod.Session.SessionType

data StorageOperation'
  = forall result. StorageOperation' (StorageOperation result)

deriving stock instance Show StorageOperation'

{- FOURMOLU_DISABLE -}

instance Eq StorageOperation' where
  == :: StorageOperation' -> StorageOperation' -> Bool
(==) = \case
    StorageOperation' a :: StorageOperation result
a@GetSession{}     -> \case StorageOperation' b :: StorageOperation result
b@GetSession{}     -> StorageOperation result
a StorageOperation result -> StorageOperation result -> Bool
forall a. Eq a => a -> a -> Bool
== StorageOperation result
StorageOperation result
b; StorageOperation'
_ -> Bool
False
    StorageOperation' a :: StorageOperation result
a@DeleteSession{}  -> \case StorageOperation' b :: StorageOperation result
b@DeleteSession{}  -> StorageOperation result
a StorageOperation result -> StorageOperation result -> Bool
forall a. Eq a => a -> a -> Bool
== StorageOperation result
StorageOperation result
b; StorageOperation'
_ -> Bool
False
    StorageOperation' a :: StorageOperation result
a@InsertSession{}  -> \case StorageOperation' b :: StorageOperation result
b@InsertSession{}  -> StorageOperation result
a StorageOperation result -> StorageOperation result -> Bool
forall a. Eq a => a -> a -> Bool
== StorageOperation result
StorageOperation result
b; StorageOperation'
_ -> Bool
False
    StorageOperation' a :: StorageOperation result
a@ReplaceSession{} -> \case StorageOperation' b :: StorageOperation result
b@ReplaceSession{} -> StorageOperation result
a StorageOperation result -> StorageOperation result -> Bool
forall a. Eq a => a -> a -> Bool
== StorageOperation result
StorageOperation result
b; StorageOperation'
_ -> Bool
False

{- FOURMOLU_ENABLE -}

data StorageOperation result
  = -- | Get the session for the given session key
    --
    --   Returns 'Nothing' if the session is not found.
    result ~ Maybe Session => GetSession SessionKey
  | -- | Delete the session with given session key
    --
    -- Does not do anything if the session is not found.
    result ~ () => DeleteSession SessionKey
  | -- | Insert a new session
    --
    -- Throws 'SessionAlreadyExists' if there already exists a session with the same key.
    -- We only call this method after generating a fresh session key.
    result ~ () => InsertSession Session
  | -- | Replace the contents of a session
    --
    -- Throws 'SessionDoesNotExist' if there is no session with the given session key.
    -- We only call this method when updating a session that is known to exist.
    result ~ () => ReplaceSession Session

deriving stock instance Eq (StorageOperation result)
deriving stock instance Show (StorageOperation result)