packages feed

constrained-monads-0.5.0.0: bench/NoAdo.hs

{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE DataKinds        #-}

module NoAdo where

import           Control.Monad.Constrained
import           Data.Set
import           EnumVect
import           Prob
import           Numeric.Sized.WordOfSize

sumThriceNoAdo :: [Int] -> Int
sumThriceNoAdo xs = size $ do
  a <- fromList' xs
  b <- fromList' xs
  c <- upTo' (a + b)
  d <- fromList' xs
  e <- fromList' xs
  pure (c + e + d)
  where
    upTo' n = fromList [1..n]
    fromList' = fromList

diceNoAdo :: Int -> [Int] -> Double
diceNoAdo n die' = probOf n $ do
  a <- die
  b <- die
  c <- upTo' (a + b)
  d <- die
  e <- die
  pure (c + e + d)
  where
    die = uniform die'
    upTo' = upTo

diceVectNoAdo :: WordOfSize 3 -> [WordOfSize 3] -> Double
diceVectNoAdo n die' = probOfV n $ do
  a <- die
  b <- upTo' a
  c <- die
  d <- upTo' c
  pure (b + d)
  where
    die = uniformV die'
    upTo' = upToV