--- |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
+infixl 5 ⊳
+-- | (⊳) = ('|>')
+--
+-- U+22B3, CONTAINS AS NORMAL SUBGROUP
+(⊳) ∷ Sequence α a ⇒ α → a → α
+(⊳) = (|>)
+
+infixr 5 ⋈
+-- | (⋈) = ('><')
+--
+-- U+22C8, BOWTIE
+(⋈) ∷ Sequence α a ⇒ α → α → α
+(⋈) = (><)
+
+-- |Generalised @mapM@ from any 'Foldable' to 'Unfoldable'. Why isn't
+-- this in the @collections-api@?
+mapM ∷ (Foldable α a, Unfoldable β b, Functor m, Monad m)
+ ⇒ (a → m b) → α → m β
+{-# INLINE mapM #-}
+mapM = flip foldrM empty ∘ (flip ((<$>) ∘ flip insert) ∘)
+
+-- |Get the modification time of a given file.
+getLastModified ∷ FilePath → IO UTCTime
+getLastModified = (cs <$>) ∘ getModificationTime