module Numeric.CollectErrors
(
ErrorCertaintyLevel(..), NumError(..), NumErrors, sample_NumErrors
, CN
, hasCertainError, hasCertainErrorCN
, noValueCN
, noValueNumErrorCertainCN, noValueNumErrorPotentialCN
, getMaybeValueCN, getErrorsCN, prependErrorsCN
, CanEnsureCN, EnsureCN, EnsureNoCN
, ensureCN, deEnsureCN, ensureNoCN
, noValueECN, prependErrorsECN
, noValueNumErrorCertainECN, noValueNumErrorPotentialECN
, CanExtractCN, extractCN
, cn, deCN, (~!)
)
where
import Prelude
(Show(..), Eq(..), Bool, String, Maybe(..), Either(..), (++), (.), or, map, fst, ($))
import Control.CollectErrors
data NumError =
DivByZero | OutOfRange String | NumError String
deriving (Eq)
instance Show NumError where
show DivByZero = "division by 0"
show (OutOfRange s) = "out of range: " ++ s
show (NumError s) = "numeric error: " ++ s
data ErrorCertaintyLevel =
ErrorCertain | ErrorPotential
deriving (Eq)
instance Show ErrorCertaintyLevel where
show ErrorCertain = "ERROR"
show ErrorPotential = "POTENTIAL ERROR"
type NumErrors = [(ErrorCertaintyLevel, NumError)]
instance CanTestErrorsCertain NumErrors where
hasCertainError es =
or $ map ((== ErrorCertain) . fst) es
hasCertainErrorCN :: CN v -> Bool
hasCertainErrorCN = hasCertainErrorCE
sample_NumErrors :: Maybe [(ErrorCertaintyLevel, NumError)]
sample_NumErrors = Nothing
type CN = CollectErrors NumErrors
type CanEnsureCN = CanEnsureCE NumErrors
type EnsureCN a = EnsureCE NumErrors a
type EnsureNoCN a = EnsureNoCE NumErrors a
type CanExtractCN f = CanExtractCE NumErrors f
extractCN ::
(CanEnsureCN c, CanExtractCN f) =>
f c -> CN (f (EnsureNoCN c))
extractCN = extractCE sample_NumErrors
ensureCN :: (CanEnsureCN v) => v -> EnsureCN v
ensureCN = ensureCE sample_NumErrors
deEnsureCN :: (CanEnsureCN v) => EnsureCN v -> Either NumErrors v
deEnsureCN = deEnsureCE sample_NumErrors
ensureNoCN :: (CanEnsureCN v) => v -> (Maybe (EnsureNoCN v), NumErrors)
ensureNoCN = ensureNoCE sample_NumErrors
noValueECN :: (CanEnsureCN v) => Maybe v -> NumErrors -> EnsureCN v
noValueECN = noValueECE
prependErrorsECN :: (CanEnsureCN v) => Maybe v -> NumErrors -> EnsureCN v -> EnsureCN v
prependErrorsECN = prependErrorsECE
noValueNumErrorCertainECN :: (CanEnsureCN v) => Maybe v -> NumError -> EnsureCN v
noValueNumErrorCertainECN sample_v e = noValueECE sample_v [(ErrorCertain, e)]
noValueNumErrorPotentialECN :: (CanEnsureCN v) => Maybe v -> NumError -> EnsureCN v
noValueNumErrorPotentialECN sample_v e = noValueECE sample_v [(ErrorPotential, e)]
getErrorsCN :: CN v -> NumErrors
getErrorsCN = getErrorsCE
getMaybeValueCN :: CN v -> Maybe v
getMaybeValueCN = getMaybeValueCE
noValueCN :: NumErrors -> CN v
noValueCN = noValueCE
noValueNumErrorCertainCN :: NumError -> CN v
noValueNumErrorCertainCN e = noValueCN [(ErrorCertain, e)]
noValueNumErrorPotentialCN :: NumError -> CN v
noValueNumErrorPotentialCN e = noValueCN [(ErrorPotential, e)]
prependErrorsCN :: NumErrors -> CN v -> CN v
prependErrorsCN = prependErrorsCE
cn :: (CanEnsureCN v) => v -> EnsureCN v
cn = ensureCN
deCN :: (CanEnsureCN v) => EnsureCN v -> Either NumErrors v
deCN = deEnsureCN
(~!) :: (CanEnsureCN v, Show v) => v -> EnsureNoCN v
(~!) = getValueOrThrowErrorsNCE sample_NumErrors