module RealDice.Die (DieGen, roll1d, mkDieGen, mkDieGenCustom) where
import RealDice.Generate.BalancedTables (rdIntsPrime)
import RealDice.Manipulate.GetValueFromRNGTable (getIntByIndex)
import RealDice.Manipulate.RandomizeList (randomizeList)
data DieGen where
DieGen :: {DieGen -> Int
index :: Int, DieGen -> [Int]
intTable :: [Int]} -> DieGen
mkDieGen :: Int -> DieGen
mkDieGen :: Int -> DieGen
mkDieGen Int
i = Int -> [Int] -> DieGen
mkDieGenCustom Int
i [Int]
rdIntsPrime
mkDieGenCustom :: Int -> [Int] -> DieGen
mkDieGenCustom :: Int -> [Int] -> DieGen
mkDieGenCustom Int
i [] = DieGen {index :: Int
index = Int
i, intTable :: [Int]
intTable = [Int]
rdIntsPrime}
mkDieGenCustom Int
i [Int]
table = DieGen {index :: Int
index = Int
i, intTable :: [Int]
intTable = [Int]
table}
roll1d ::
Int ->
DieGen ->
( Int,
DieGen
)
roll1d :: Int -> DieGen -> (Int, DieGen)
roll1d Int
n DieGen
die
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
1 = (Int
0, DieGen
die)
| Bool
otherwise =
( Int -> [Int] -> Int
getIntByIndex
(Int -> [Int] -> Int
getIntByIndex (DieGen -> Int
index DieGen
die) (DieGen -> [Int]
intTable DieGen
die))
([Int] -> [Int]
randomizeList [Int
1 .. Int
n]),
DieGen {index :: Int
index = DieGen -> Int
index DieGen
die Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1, intTable :: [Int]
intTable = DieGen -> [Int]
intTable DieGen
die}
)