module RealDice.Coin (CoinGen, flipCoin, mkCoinGen, mkCoinGenCustom) where
import RealDice.Generate.BalancedTables (rdBoolsPrime)
import RealDice.Manipulate.GetValueFromRNGTable (getBoolByIndex)
data CoinGen where
CoinGen :: {CoinGen -> Int
index :: Int, CoinGen -> [Bool]
boolTable :: [Bool]} -> CoinGen
mkCoinGen :: Int -> CoinGen
mkCoinGen :: Int -> CoinGen
mkCoinGen Int
i = Int -> [Bool] -> CoinGen
mkCoinGenCustom Int
i [Bool]
rdBoolsPrime
mkCoinGenCustom :: Int -> [Bool] -> CoinGen
mkCoinGenCustom :: Int -> [Bool] -> CoinGen
mkCoinGenCustom Int
i [] = CoinGen {index :: Int
index = Int
i, boolTable :: [Bool]
boolTable = [Bool]
rdBoolsPrime}
mkCoinGenCustom Int
i [Bool]
table = CoinGen {index :: Int
index = Int
i, boolTable :: [Bool]
boolTable = [Bool]
table}
flipCoin :: CoinGen -> (Bool, CoinGen)
flipCoin :: CoinGen -> (Bool, CoinGen)
flipCoin CoinGen
coin =
( Int -> [Bool] -> Bool
getBoolByIndex (CoinGen -> Int
index CoinGen
coin) (CoinGen -> [Bool]
boolTable CoinGen
coin),
CoinGen {index :: Int
index = CoinGen -> Int
index CoinGen
coin Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1, boolTable :: [Bool]
boolTable = CoinGen -> [Bool]
boolTable CoinGen
coin}
)