packages feed

devforms-0.3.0.0: src/BoundedNumber.hs

module BoundedNumber (BoundedNumber, parseWithBounds, unwrapBounded, NumberBoundError (..))
where

data BoundedNumber a = BoundedNumber a

data NumberBoundError = NumberOutOfBounds deriving (Show)

parseWithBounds :: (Real a) => Maybe Double -> Maybe Double -> a -> Either NumberBoundError (BoundedNumber a)
parseWithBounds lb ub n =
    let lowerBoundSatisfied = maybe True (\l -> toRational l <= (toRational n)) lb
        upperBoundSatisfied = maybe True (\u -> toRational u >= (toRational n)) ub
     in if lowerBoundSatisfied && upperBoundSatisfied then pure $ BoundedNumber n else Left NumberOutOfBounds

unwrapBounded :: BoundedNumber a -> a
unwrapBounded (BoundedNumber n) = n