module ALife.Creatur.EnergyPool
(
EnergyPool(..),
PersistentEnergyPool,
mkPersistentEnergyPool
) where
import ALife.Creatur.Persistent (Persistent, mkPersistent, getPS, putPS)
import Control.Monad.State (StateT)
class EnergyPool e where
replenish :: Double -> StateT e IO ()
withdraw :: Double -> StateT e IO Double
available :: StateT e IO Double
type PersistentEnergyPool = Persistent Double
mkPersistentEnergyPool :: FilePath -> PersistentEnergyPool
mkPersistentEnergyPool = mkPersistent 0
instance EnergyPool PersistentEnergyPool where
replenish = putPS
withdraw xWanted = do
xTotal <- getPS
let x = min xWanted xTotal
putPS (xTotal x)
return x
available = getPS