module Codec.Binary.QRCode.Utils where
import Numeric
import Data.Char
import Codec.Binary.QRCode.Spec
import Codec.Binary.QRCode.GaloisField
import Control.Monad.Reader
type Input = String
type BitStream = String
type ReaderQR = Reader Version
data Module = Dark | Light deriving (Eq)
type Modules = [Module]
instance Bounded Module where
maxBound = Light
minBound = Dark
instance Show Module where
show Dark = "*"
show Light = " "
qrXor :: Module -> Module -> Module
qrXor Dark Dark = Light
qrXor Light Light = Light
qrXor Dark Light = Dark
qrXor Light Dark = Dark
toModules :: BitStream -> Modules
toModules = map conv
where conv '1' = Dark
conv '0' = Light
conv x = error $ "Invalid BitStream element " ++ show x
showBinPadded :: Int -> Int -> String
showBinPadded len n = replicate (len length str) '0' ++ str
where
str = showIntAtBase 2 intToDigit n ""
chunksOf :: Int -> [a] -> [[a]]
chunksOf n xs = go xs (length xs) []
where go xs' remLen acc | remLen <= n = reverse (xs' : acc)
| otherwise = go (drop n xs') (remLen n) (take n xs' : acc)
toPoly :: BitStream -> GFPolynomial
toPoly = mkPolynomial . map digitToInt