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")