1 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
5 import Control.Applicative
6 import Control.Monad.Random
7 import Control.Monad(replicateM, liftM)
10 ------------------------------------------------------------
13 newtype DieValue = DV { unDV :: Int }
14 deriving (Eq, Ord, Show, Num)
16 first :: (a -> b) -> (a, c) -> (b, c)
17 first f (a, c) = (f a, c)
19 instance Random DieValue where
20 random = first DV . randomR (1,6)
21 randomR (low,hi) = first DV . randomR (max 1 (unDV low), min 6 (unDV hi))
23 die :: Rand StdGen DieValue
26 ------------------------------------------------------------
31 data Battlefield = Battlefield { attackers :: Army, defenders :: Army }
33 -- battle :: Battlefield -> Rand StdGen Battlefield
34 battle (Battlefield {attackers = a, defenders = d}) =
35 let rolla = replicateM (min (a - 1) 3) die
36 rolld = replicateM (min d 2) die
37 zipped = liftA2 zip rolla rolld