packages feed

moffy-samples-events-0.1.0.0: src/Control/Moffy/Samples/Handle/Random.hs

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

module Control.Moffy.Samples.Handle.Random (
	-- * Type
	RandomEv, RandomState(..),
	-- * Handle
	handleRandom ) where

import Control.Moffy.Samples.Event.Random.Internal (
	RandomEv, StoreRandomGen(..), pattern OccStoreRandomGen,
	LoadRandomGen, pattern OccLoadRandomGen )
import Control.Moffy.Handle (HandleSt', mergeSt)
import Data.Type.Set (Singleton)
import Data.OneOrMore as Oom (pattern Singleton)
import System.Random (StdGen)

import Data.OneOrMoreApp as Ooma (pattern Singleton)

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

-- * RANDOM STATE
-- * HANDLE

---------------------------------------------------------------------------
-- RANDOM STATE
---------------------------------------------------------------------------

class RandomState s where
	getRandomGen :: s -> StdGen; putRandomGen :: s -> StdGen -> s

instance RandomState StdGen where getRandomGen = id; putRandomGen = flip const

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

handleRandom :: (RandomState s, Monad m) => HandleSt' s m RandomEv
handleRandom = handleStoreRandomGen `mergeSt` handleLoadRandomGen

handleStoreRandomGen :: (RandomState s, Applicative m) =>
	HandleSt' s m (Singleton StoreRandomGen)
handleStoreRandomGen (Oom.Singleton (StoreRandomGenReq g)) s =
	pure (Just $ Ooma.Singleton OccStoreRandomGen, s `putRandomGen` g)

handleLoadRandomGen :: (RandomState s, Applicative m) =>
	HandleSt' s m (Singleton LoadRandomGen)
handleLoadRandomGen _rqs s =
	pure (Just . Ooma.Singleton . OccLoadRandomGen $ getRandomGen s, s)