packages feed

deka-0.6.0.0: native/Generators.hs

-- | Generators of native data types.

module Generators where

import Control.Applicative
import Test.QuickCheck
import qualified Deka.Native as D
import qualified Deka.Dec as Dec
import Prelude hiding (exponent)

novem :: Gen D.Novem
novem = elements [minBound..maxBound]

decem :: Gen D.Decem
decem = frequency [(1, return D.D0), (9, fmap D.Nonem novem)]

decuple :: Gen D.Decuple
decuple = D.Decuple <$> novem <*> listOf decem

aut :: Gen D.Aut
aut = frequency [(1, return D.Nil), (4, fmap D.Plenus decuple)]

posNeg :: Gen Dec.PosNeg
posNeg = elements [Dec.Pos, Dec.Neg]

firmado :: Gen D.Firmado
firmado = frequency [(1, return D.Cero)
  , (4, D.Completo <$> posNeg <*> decuple)]

coefficient :: Gen D.Coefficient
coefficient = fmap D.Coefficient aut

exponent :: Gen D.Exponent
exponent = fmap D.Exponent firmado

diagnostic :: Gen D.Diagnostic
diagnostic = fmap D.Diagnostic decuple

noisy :: Gen D.Noisy
noisy = elements [D.Quiet, D.Signaling]

nonNum :: Gen D.NonNum
nonNum = D.NonNum
  <$> noisy
  <*> frequency [(1, return Nothing), (3, fmap Just diagnostic)]

value :: Gen D.Value
value = frequency
  [ (4, D.Finite <$> coefficient <*> exponent)
  , (1, return D.Infinite)
  , (1, fmap D.NotANumber nonNum)
  ]

sign :: Gen Dec.Sign
sign = elements [ Dec.Sign1, Dec.Sign0 ]

abstract :: Gen D.Abstract
abstract = D.Abstract <$> sign <*> value