Commit 36bc8d65 authored by Hans-Peter Deifel's avatar Hans-Peter Deifel 🐢
Browse files

wta: Implement Probability in terms of Data.Scientific

This already does all we need, so instead of duplicating the whole
implementation, just use it.
parent e7905578
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -302,4 +302,5 @@ executable random-wta
                     , text
                     , random >= 1.1 && <1.2
                     , mtl >= 2.2 && <2.3
                     , megaparsec >= 7
                     , megaparsec >= 7 && <8
                     , scientific >= 0.3 && <0.4
+12 −12
Original line number Diff line number Diff line
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Probability (Probability(..), readProbability, decide) where

import           System.Random
import           Text.Printf
import           Data.Scientific

data Probability = Probability Integer Int
newtype Probability = Probability Scientific
  deriving newtype (Show)

readProbability :: String -> Either String Probability
readProbability input = case input of
  "0" -> Right (Probability 0 0)
readProbability input = Probability <$> case input of
  "0" -> Right (scientific 0 0)
  ('0':'.':rest) -> case reads rest of
    [(digits, "")] -> Right (Probability digits (length rest))
    [(digits, "")] -> Right (scientific digits (negate (length rest)))
    _ -> failure
  "1" -> Right (Probability 1 0)
  "1" -> Right (scientific 1 0)
  ('1':'.':rest)
    | all (=='0') rest -> Right (Probability 1 0)
    | all (=='0') rest -> Right (scientific 1 0)
    | otherwise -> failure
  _ -> failure

  where failure = Left "Could not parse probability"

instance Show Probability where
  show (Probability digits 0) = show digits
  show (Probability digits exp) = "0." ++ printf "%0*d" exp digits

decide :: Probability -> IO Bool
decide (Probability digits exp) = do
decide (Probability science) = do
  let digits = coefficient science
  let exp  = negate (base10Exponent science)
  randomNumber <- randomRIO (0, (10^exp)-1)
  return $ randomNumber < digits