packages feed

moffy-0.1.0.0: src/Control/Moffy/Handle/Lock.hs

{-# LANGUAGE PatternSynonyms #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Control.Moffy.Handle.Lock (
	-- * Type
	LockEv, LockState(..), LockId,
	-- * Handle
	handleLock ) where

import Control.Moffy.Event.Lock.Internal (
	LockEv, LockId(..), NewLockId(..), pattern OccNewLockId,
	GetLock(..), pattern OccGetLock, Unlock(..), pattern OccUnlock )
import Control.Moffy.Handle (HandleSt', mergeSt)
import Data.Type.Set (Singleton)
import Data.OneOrMore as Oom (pattern Singleton)
import Data.Bool (bool)

import Data.OneOrMoreApp as Ooma (pattern Singleton)

---------------------------------------------------------------------------

-- * LOCK STATE
-- * HANDLE

---------------------------------------------------------------------------
-- LOCK STATE
---------------------------------------------------------------------------

class LockState s where
	getNextLockId :: s -> Int; putNextLockId :: s -> Int -> s
	isLocked :: s -> LockId -> Bool
	lockIt :: s -> LockId -> s; unlockIt :: s -> LockId -> s

---------------------------------------------------------------------------
-- HANDLE
---------------------------------------------------------------------------

handleLock :: (LockState s, Monad m) => HandleSt' s m LockEv
handleLock = handleNewLockId `mergeSt` handleGetLock `mergeSt` handleUnlock

handleNewLockId ::
	(LockState s, Applicative m) => HandleSt' s m (Singleton NewLockId)
handleNewLockId (Oom.Singleton (NewLockIdReq t)) s = pure (
	Just . Ooma.Singleton $ OccNewLockId (LockId i) t,
	s `putNextLockId` (i + 1) )
	where i = getNextLockId s

handleGetLock ::
	(LockState s, Applicative m) => HandleSt' s m (Singleton GetLock)
handleGetLock (Oom.Singleton (GetLockReq i t _)) s = pure $ bool
	(Just . Ooma.Singleton $ OccGetLock i t, s `lockIt` i) (Nothing, s)
	(s `isLocked` i)

handleUnlock :: (LockState s, Applicative m) => HandleSt' s m (Singleton Unlock)
handleUnlock (Oom.Singleton (UnlockReq i)) s =
	pure (Just $ Ooma.Singleton OccUnlock, s `unlockIt` i)