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 :: forall a. Integral a => a -> a -> [a] decomposePositional a b = forall b a. (b -> Maybe (a, b)) -> b -> [a] unfoldr (\a n -> forall a. Bool -> a -> Maybe a toMaybe (a nforall a. Eq a => a -> a -> Bool /=a 0) forall a b. (a -> b) -> a -> b $ forall a b. (a, b) -> (b, a) swap (forall a. Integral a => a -> a -> (a, a) divMod a n a b)) intFromDigit :: Char -> Exceptional String Int intFromDigit :: Char -> Exceptional String Int intFromDigit Char c = if forall a. Ix a => (a, a) -> a -> Bool inRange (Char '0',Char '9') Char c then forall e a. a -> Exceptional e a Success forall a b. (a -> b) -> a -> b $ forall a. Ix a => (a, a) -> a -> Int index (Char '0',Char '9') Char c else forall e a. e -> Exceptional e a throw forall a b. (a -> b) -> a -> b $ String "not a digit: " forall a. [a] -> [a] -> [a] ++ [Char c] processValid :: Exceptional String Bool -> Maybe String processValid :: Exceptional String Bool -> Maybe String processValid = forall e b a. (e -> b) -> (a -> b) -> Exceptional e a -> b ME.switch forall a. a -> Maybe a Just (\Bool b -> forall a. Bool -> a -> Maybe a toMaybe (Bool -> Bool not Bool b) String "check sum does not match")