{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE RecordWildCards #-} module Codec.QRCode.Data.MQRImage ( MQRImage1(..) , MQRImage2(..) , MQRImage3(..) , new , unsafeConvert , clone , unsafeFreeze ) where import Codec.QRCode.Base import Control.Monad.Primitive (PrimMonad, PrimState) import qualified Data.Vector.Unboxed as UV import qualified Data.Vector.Unboxed.Mutable as MUV import Codec.QRCode.Code.Data import Codec.QRCode.Data.ErrorLevel import Codec.QRCode.Data.QRImage import Codec.QRCode.Data.Version data MQRImage1 s = MQRImage1 { forall s. MQRImage1 s -> Int mqrImage1Size :: !Int , forall s. MQRImage1 s -> MVector s Bool mqrImage1Data :: !(MUV.MVector s Bool) , forall s. MQRImage1 s -> MVector s Bool mqrImage1Fixed :: !(MUV.MVector s Bool) , forall s. MQRImage1 s -> Version mqrImage1Version :: !Version , forall s. MQRImage1 s -> ErrorLevel mqrImage1ErrorLevel :: !ErrorLevel } data MQRImage2 s = MQRImage2 { forall s. MQRImage2 s -> Int mqrImage2Size :: !Int , forall s. MQRImage2 s -> MVector s Bool mqrImage2Data :: !(MUV.MVector s Bool) , forall s. MQRImage2 s -> Vector Bool mqrImage2Fixed :: !(UV.Vector Bool) , forall s. MQRImage2 s -> Version mqrImage2Version :: !Version , forall s. MQRImage2 s -> ErrorLevel mqrImage2ErrorLevel :: !ErrorLevel } data MQRImage3 s = MQRImage3 { forall s. MQRImage3 s -> Int mqrImage3Size :: !Int , forall s. MQRImage3 s -> MVector s Bool mqrImage3Data :: !(MUV.MVector s Bool) , forall s. MQRImage3 s -> Vector Bool mqrImage3Fixed :: !(UV.Vector Bool) , forall s. MQRImage3 s -> Version mqrImage3Version :: !Version , forall s. MQRImage3 s -> ErrorLevel mqrImage3ErrorLevel :: !ErrorLevel } new :: PrimMonad m => Version -> ErrorLevel -> m (MQRImage1 (PrimState m)) new :: forall (m :: * -> *). PrimMonad m => Version -> ErrorLevel -> m (MQRImage1 (PrimState m)) new Version v ErrorLevel e = do let size :: Int size = Version -> Int qrSize Version v MVector (PrimState m) Bool img <- forall (m :: * -> *) a. (PrimMonad m, Unbox a) => Int -> m (MVector (PrimState m) a) MUV.new (Int size forall a. Num a => a -> a -> a * Int size) forall (m :: * -> *) a. (PrimMonad m, Unbox a) => MVector (PrimState m) a -> a -> m () MUV.set MVector (PrimState m) Bool img Bool False MVector (PrimState m) Bool fix <- forall (m :: * -> *) a. (PrimMonad m, Unbox a) => Int -> m (MVector (PrimState m) a) MUV.new (Int size forall a. Num a => a -> a -> a * Int size) forall (m :: * -> *) a. (PrimMonad m, Unbox a) => MVector (PrimState m) a -> a -> m () MUV.set MVector (PrimState m) Bool fix Bool False forall (m :: * -> *) a. Monad m => a -> m a return MQRImage1 { mqrImage1Size :: Int mqrImage1Size = Int size , mqrImage1Data :: MVector (PrimState m) Bool mqrImage1Data = MVector (PrimState m) Bool img , mqrImage1Fixed :: MVector (PrimState m) Bool mqrImage1Fixed = MVector (PrimState m) Bool fix , mqrImage1Version :: Version mqrImage1Version = Version v , mqrImage1ErrorLevel :: ErrorLevel mqrImage1ErrorLevel = ErrorLevel e } unsafeConvert :: PrimMonad m => MQRImage1 (PrimState m) -> m (MQRImage2 (PrimState m)) unsafeConvert :: forall (m :: * -> *). PrimMonad m => MQRImage1 (PrimState m) -> m (MQRImage2 (PrimState m)) unsafeConvert MQRImage1{Int MVector (PrimState m) Bool ErrorLevel Version mqrImage1ErrorLevel :: ErrorLevel mqrImage1Version :: Version mqrImage1Fixed :: MVector (PrimState m) Bool mqrImage1Data :: MVector (PrimState m) Bool mqrImage1Size :: Int mqrImage1ErrorLevel :: forall s. MQRImage1 s -> ErrorLevel mqrImage1Version :: forall s. MQRImage1 s -> Version mqrImage1Fixed :: forall s. MQRImage1 s -> MVector s Bool mqrImage1Data :: forall s. MQRImage1 s -> MVector s Bool mqrImage1Size :: forall s. MQRImage1 s -> Int ..} = do Vector Bool fix <- forall a (m :: * -> *). (Unbox a, PrimMonad m) => MVector (PrimState m) a -> m (Vector a) UV.unsafeFreeze MVector (PrimState m) Bool mqrImage1Fixed forall (m :: * -> *) a. Monad m => a -> m a return MQRImage2 { mqrImage2Size :: Int mqrImage2Size = Int mqrImage1Size , mqrImage2Data :: MVector (PrimState m) Bool mqrImage2Data = MVector (PrimState m) Bool mqrImage1Data , mqrImage2Fixed :: Vector Bool mqrImage2Fixed = Vector Bool fix , mqrImage2Version :: Version mqrImage2Version = Version mqrImage1Version , mqrImage2ErrorLevel :: ErrorLevel mqrImage2ErrorLevel = ErrorLevel mqrImage1ErrorLevel } clone :: PrimMonad m => MQRImage2 (PrimState m) -> m (MQRImage3 (PrimState m)) clone :: forall (m :: * -> *). PrimMonad m => MQRImage2 (PrimState m) -> m (MQRImage3 (PrimState m)) clone MQRImage2{Int MVector (PrimState m) Bool Vector Bool ErrorLevel Version mqrImage2ErrorLevel :: ErrorLevel mqrImage2Version :: Version mqrImage2Fixed :: Vector Bool mqrImage2Data :: MVector (PrimState m) Bool mqrImage2Size :: Int mqrImage2ErrorLevel :: forall s. MQRImage2 s -> ErrorLevel mqrImage2Version :: forall s. MQRImage2 s -> Version mqrImage2Fixed :: forall s. MQRImage2 s -> Vector Bool mqrImage2Data :: forall s. MQRImage2 s -> MVector s Bool mqrImage2Size :: forall s. MQRImage2 s -> Int ..} = do MVector (PrimState m) Bool img <- forall (m :: * -> *) a. (PrimMonad m, Unbox a) => MVector (PrimState m) a -> m (MVector (PrimState m) a) MUV.clone MVector (PrimState m) Bool mqrImage2Data forall (m :: * -> *) a. Monad m => a -> m a return MQRImage3 { mqrImage3Size :: Int mqrImage3Size = Int mqrImage2Size , mqrImage3Data :: MVector (PrimState m) Bool mqrImage3Data = MVector (PrimState m) Bool img , mqrImage3Fixed :: Vector Bool mqrImage3Fixed = Vector Bool mqrImage2Fixed , mqrImage3Version :: Version mqrImage3Version = Version mqrImage2Version , mqrImage3ErrorLevel :: ErrorLevel mqrImage3ErrorLevel = ErrorLevel mqrImage2ErrorLevel } unsafeFreeze :: PrimMonad m => MQRImage3 (PrimState m) -> m QRImage unsafeFreeze :: forall (m :: * -> *). PrimMonad m => MQRImage3 (PrimState m) -> m QRImage unsafeFreeze MQRImage3{Int MVector (PrimState m) Bool Vector Bool ErrorLevel Version mqrImage3ErrorLevel :: ErrorLevel mqrImage3Version :: Version mqrImage3Fixed :: Vector Bool mqrImage3Data :: MVector (PrimState m) Bool mqrImage3Size :: Int mqrImage3ErrorLevel :: forall s. MQRImage3 s -> ErrorLevel mqrImage3Version :: forall s. MQRImage3 s -> Version mqrImage3Fixed :: forall s. MQRImage3 s -> Vector Bool mqrImage3Data :: forall s. MQRImage3 s -> MVector s Bool mqrImage3Size :: forall s. MQRImage3 s -> Int ..} = do Vector Bool img <- forall a (m :: * -> *). (Unbox a, PrimMonad m) => MVector (PrimState m) a -> m (Vector a) UV.unsafeFreeze MVector (PrimState m) Bool mqrImage3Data forall (m :: * -> *) a. Monad m => a -> m a return QRImage { qrVersion :: Int qrVersion = Version -> Int unVersion Version mqrImage3Version , qrErrorLevel :: ErrorLevel qrErrorLevel = ErrorLevel mqrImage3ErrorLevel , qrImageSize :: Int qrImageSize = Int mqrImage3Size , qrImageData :: Vector Bool qrImageData = Vector Bool img }