checksum-0.0: src/Math/Checksum/Utility.hs
module Math.Checksum.Utility where
import qualified Control.Monad.Exception.Synchronous as ME
import Control.Monad.Exception.Synchronous (Exceptional(Success), throw)
import Data.Ix (inRange, index)
import Data.List (unfoldr)
import Data.Maybe.HT (toMaybe)
import Data.Tuple.HT (swap)
decomposePositional :: Integral a => a -> a -> [a]
decomposePositional b =
unfoldr (\n -> toMaybe (n/=0) $ swap (divMod n b))
intFromDigit :: Char -> Exceptional String Int
intFromDigit c =
if inRange ('0','9') c
then Success $ index ('0','9') c
else throw $ "not a digit: " ++ [c]
processValid :: Exceptional String Bool -> Maybe String
processValid =
ME.switch Just (\b -> toMaybe (not b) "check sum does not match")