Z-Data-0.1.8.0: Z/Data/Vector/QQ.hs
{-|
Module : Z.Data.Vector.QQ
Description : vectors literals using QuasiQuote
Copyright : (c) Dong Han, 2017-2018
License : BSD
Maintainer : winterland1989@gmail.com
Stability : experimental
Portability : non-portable
This module provides functions for writing vector literals using 'QuasiQuote' similar to "Z.Data.Array.QQ" module.
@
> :set -XQuasiQuotes
> :t [vecASCII|asdfg|]
[vecASCII|asdfg|] :: Z.Data.Vector.Base.PrimVector GHC.Word.Word8
> [vecASCII|asdfg|]
[97,115,100,102,103]
> :t [vecI16|1,2,3,4,5|]
[vecI16|1,2,3,4,5|] :: Z.Data.Vector.Base.PrimVector GHC.Int.Int16
> [vecI16|1,2,3,4,5|]
[1,2,3,4,5]
@
-}
module Z.Data.Vector.QQ (
-- * QuasiQuoters
vecASCII
, vecW8, vecW16, vecW32, vecW64, vecWord
, vecI8, vecI16, vecI32, vecI64, vecInt
) where
import qualified Language.Haskell.TH.Quote as QQ
import Z.Data.Array.QQ as QQ
import Z.Data.Vector.Base
--------------------------------------------------------------------------------
-- Quoters
vecASCII :: QQ.QuasiQuoter
vecASCII = QQ.QuasiQuoter
(asciiLiteral $ \ len addr -> [| PrimVector (QQ.word8ArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecASCII as a pattern")
(error "Cannot use vecASCII as a type")
(error "Cannot use vecASCII as a dec")
vecW8 :: QQ.QuasiQuoter
vecW8 = QQ.QuasiQuoter
(QQ.word8Literal $ \ len addr -> [| PrimVector (QQ.word8ArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecW8 as a pattern")
(error "Cannot use vecW8 as a type")
(error "Cannot use vecW8 as a dec")
vecW16 :: QQ.QuasiQuoter
vecW16 = QQ.QuasiQuoter
(QQ.word16Literal $ \ len addr -> [| PrimVector (QQ.word16ArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecW16 as a pattern")
(error "Cannot use vecW16 as a type")
(error "Cannot use vecW16 as a dec")
vecW32 :: QQ.QuasiQuoter
vecW32 = QQ.QuasiQuoter
(QQ.word32Literal $ \ len addr -> [| PrimVector (QQ.word32ArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecW32 as a pattern")
(error "Cannot use vecW32 as a type")
(error "Cannot use vecW32 as a dec")
vecW64 :: QQ.QuasiQuoter
vecW64 = QQ.QuasiQuoter
(QQ.word64Literal $ \ len addr -> [| PrimVector (QQ.word64ArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecW64 as a pattern")
(error "Cannot use vecW64 as a type")
(error "Cannot use vecW64 as a dec")
vecWord :: QQ.QuasiQuoter
vecWord = QQ.QuasiQuoter
(QQ.wordLiteral $ \ len addr ->
[| PrimVector (QQ.wordArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecWord as a pattern")
(error "Cannot use vecWord as a type")
(error "Cannot use vecWord as a dec")
vecI8 :: QQ.QuasiQuoter
vecI8 = QQ.QuasiQuoter
(QQ.int8Literal $ \ len addr ->
[| PrimVector (QQ.int8ArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecI8 as a pattern")
(error "Cannot use vecI8 as a type")
(error "Cannot use vecI8 as a dec")
vecI16 :: QQ.QuasiQuoter
vecI16 = QQ.QuasiQuoter
(QQ.int16Literal $ \ len addr ->
[| PrimVector (QQ.int16ArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecI16 as a pattern")
(error "Cannot use vecI16 as a type")
(error "Cannot use vecI16 as a dec")
vecI32 :: QQ.QuasiQuoter
vecI32 = QQ.QuasiQuoter
(QQ.int32Literal $ \ len addr ->
[| PrimVector (QQ.int32ArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecI32 as a pattern")
(error "Cannot use vecI32 as a type")
(error "Cannot use vecI32 as a dec")
vecI64 :: QQ.QuasiQuoter
vecI64 = QQ.QuasiQuoter
(QQ.int64Literal $ \ len addr ->
[| PrimVector (QQ.int64ArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecI64 as a pattern")
(error "Cannot use vecI64 as a type")
(error "Cannot use vecI64 as a dec")
vecInt :: QQ.QuasiQuoter
vecInt = QQ.QuasiQuoter
(QQ.intLiteral $ \ len addr ->
[| PrimVector (QQ.intArrayFromAddr $(len) $(addr)) 0 $(len) |])
(error "Cannot use vecInt as a pattern")
(error "Cannot use vecInt as a type")
(error "Cannot use vecInt as a dec")