-- | This module exports a quasiquoter for binary integer literals.
--
-- Example usage:
--
-- @
-- import Language.Literals.Binary
-- import Data.Word
--
-- not :: Word32 -> Word32
-- not [b| 0 |] = [b| 1 |]
-- not [b| 1 |] = [b| 0 |]
-- @
module Language.Literals.Binary where
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax
import Data.Bits
b = QuasiQuoter
{ quoteExp = return . LitE . IntegerL . readBinary
, quotePat = return . LitP . IntegerL . readBinary
, quoteType = error "No quasiquoter for types."
, quoteDec = error "No quasiquoter for declarations." }
readBinary :: String -> Integer
readBinary = foldl f 0 where
f x '0' = shift x 1
f x '1' = shift x 1 + 1
f x ' ' = x
f x _ = error "Not a valid binary literal."