+ f = dropWhile isSpace
+
+-- |Convert a 'ByteString' to an 'Exp' representing it as a literal.
+liftByteString ∷ ByteString → Q Exp
+liftByteString bs
+ = [| Strict.pack $(litE $ stringL $ Strict.unpack bs) |]
+
+-- |Convert a 'Lazy.ByteString' to an 'Exp' representing it as a
+-- literal.
+liftLazyByteString ∷ Lazy.ByteString → Q Exp
+liftLazyByteString = Lazy.foldrChunks f [| Lazy.Empty |]
+ where
+ f ∷ ByteString → Q Exp → Q Exp
+ f bs e = [| Lazy.Chunk $(liftByteString bs) $e |]
+
+-- |Convert an 'Ascii' to an 'Exp' representing it as a literal.
+liftAscii ∷ Ascii → Q Exp
+liftAscii a = [| A.unsafeFromByteString
+ $ unsafePerformIO
+ $ Strict.unsafePackAddressLen $len $ptr
+ |]
+ where
+ bs ∷ Strict.ByteString
+ bs = A.toByteString a
+
+ len, ptr ∷ Q Exp
+ len = lift $ Strict.length bs
+ ptr = litE $ stringPrimL $ Strict.unpack bs
+
+-- |Convert a 'CIAscii' to an 'Exp' representing it as a literal.
+liftCIAscii ∷ CIAscii → Q Exp
+liftCIAscii a = [| A.toCIAscii $(liftAscii $ A.fromCIAscii a) |]
+
+-- |Convert a 'Text' to an 'Exp' representing it as a literal.
+liftText ∷ Text → Q Exp
+liftText t = [| T.pack $(litE $ stringL $ T.unpack t) |]
+
+-- |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.null m = [| M.empty |]
+ | otherwise = [| M.fromDistinctAscList $(liftPairs (M.toAscList m)) |]
+ where
+ liftPairs = listE ∘ map liftPair
+ liftPair (k, v) = tupE [liftK k, liftV v]
+
+-- |Convert an 'UTCTime' to an 'Exp' representing it as a literal.
+liftUTCTime ∷ UTCTime → Q Exp
+liftUTCTime (UTCTime {..})
+ = [| UTCTime {
+ utctDay = $(liftDay utctDay)
+ , utctDayTime = $(liftDiffTime utctDayTime)
+ }
+ |]
+
+liftDay ∷ Day → Q Exp
+liftDay (ModifiedJulianDay {..})
+ = [| ModifiedJulianDay {
+ toModifiedJulianDay = $(lift toModifiedJulianDay)
+ }
+ |]
+
+liftDiffTime ∷ DiffTime → Q Exp
+liftDiffTime dt = [| fromRational ($n % $d) ∷ DiffTime |]
+ where
+ n, d ∷ Q Exp
+ n = lift $ numerator $ toRational dt
+ d = lift $ denominator $ toRational dt