, TemplateHaskell
, UnicodeSyntax
#-}
--- |Utility functions used internally in the Lucu httpd. These
--- functions may be useful too for something else.
+-- |Utility functions used internally in this package.
module Network.HTTP.Lucu.Utils
( splitBy
, quoteStr
, parseWWWFormURLEncoded
, splitPathInfo
, trim
+
+ , getLastModified
+
, liftByteString
, liftLazyByteString
, liftAscii
, liftUTCTime
)
where
+import Control.Applicative
import Control.Monad
import Data.Ascii (Ascii, CIAscii, AsciiBuilder)
import qualified Data.Ascii as A
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as Strict
-import qualified Data.ByteString.Unsafe as Strict
import qualified Data.ByteString.Lazy.Internal as Lazy
import Data.Char
import Data.List hiding (last)
import Data.Text (Text)
import qualified Data.Text as T
import Data.Time
+import Data.Time.Clock.POSIX
import Language.Haskell.TH.Lib
import Language.Haskell.TH.Syntax
import Network.URI
import Prelude hiding (last)
import Prelude.Unicode
-import System.IO.Unsafe
+import System.Directory
+import System.Time (ClockTime(..))
-- |>>> splitBy (== ':') "ab:c:def"
-- ["ab", "c", "def"]
where
f = dropWhile isSpace
+-- |Get the modification time of a given file.
+getLastModified ∷ FilePath → IO UTCTime
+getLastModified = (clockTimeToUTC <$>) ∘ getModificationTime
+ where
+ clockTimeToUTC ∷ ClockTime → UTCTime
+ clockTimeToUTC (TOD sec picoSec)
+ = posixSecondsToUTCTime
+ $ fromRational
+ $ sec % 1 + picoSec % (1000 ⋅ 1000 ⋅ 1000 ⋅ 1000)
+
-- |Convert a 'ByteString' to an 'Exp' representing it as a literal.
liftByteString ∷ ByteString → Q Exp
liftByteString bs
-- |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
+liftAscii a = [| A.unsafeFromByteString $(liftByteString $ A.toByteString a) |]
-- |Convert a 'CIAscii' to an 'Exp' representing it as a literal.
liftCIAscii ∷ CIAscii → Q Exp
-- |Convert an 'UTCTime' to an 'Exp' representing it as a literal.
liftUTCTime ∷ UTCTime → Q Exp
liftUTCTime (UTCTime {..})
- = [| UTCTime {
- utctDay = $(liftDay utctDay)
- , utctDayTime = $(liftDiffTime utctDayTime)
- }
- |]
+ = [| UTCTime $(liftDay utctDay) $(liftDiffTime utctDayTime) |]
liftDay ∷ Day → Q Exp
liftDay (ModifiedJulianDay {..})
- = [| ModifiedJulianDay {
- toModifiedJulianDay = $(lift toModifiedJulianDay)
- }
- |]
+ = [| ModifiedJulianDay $(lift toModifiedJulianDay) |]
liftDiffTime ∷ DiffTime → Q Exp
liftDiffTime dt = [| fromRational ($n % $d) ∷ DiffTime |]