- go i | i ≥ 0 ∧ i < 10 = B.fromByteString "00" ⊕ BT.digit i
- | i ≥ 0 ∧ i < 100 = B.fromByteString "0" ⊕ BT.integral i
- | i ≥ 0 ∧ i < 1000 = BT.integral i
- | otherwise = error ("show3: the integer i must satisfy 0 <= i < 1000: " ⧺ show i)
+ f = dropWhile isSpace
+
+-- |Convert a 'CIAscii' to an 'Exp' representing it as a literal.
+liftCIAscii ∷ CIAscii → Q Exp
+liftCIAscii a = [| A.toCIAscii (A.unsafeFromString $(strLit a)) |]
+ where
+ strLit ∷ CIAscii → Q Exp
+ strLit = liftString ∘ A.toString ∘ A.fromCIAscii
+
+-- |Convert a 'Text' to an 'Exp' representing it as a literal.
+liftText ∷ Text → Q Exp
+liftText t = [| T.pack $(strLit t) |]
+ where
+ strLit ∷ Text → Q Exp
+ strLit = liftString ∘ T.unpack
+
+-- |Convert an arbitrary 'Map' to an 'Exp' representing it as a
+-- literal, using a given key lifter and a value lifter.
+liftMap ∷ Eq k ⇒ (k → Q Exp) → (v → Q Exp) → Map k v → Q Exp
+liftMap liftK liftV m = [| M.fromAscList $(liftPairs $ M.toAscList m) |]
+ where
+ liftPairs = listE ∘ map liftPair
+ liftPair (k, v) = tupE [liftK k, liftV v]