module Hack.Utils where
import Hack
import Hack.Constants
import MPSUTF8
import Prelude hiding ((.), (^), (>), lookup, (+), (/))
import Network.CGI hiding (Html)
import Network.URI hiding (path)
import Data.Default
import Control.Arrow ((>>>), (<<<))
import Data.Map (toList, lookup)
import Data.Time
import Text.Template
import qualified Data.ByteString.Lazy.Char8 as B
import Control.Monad (mplus)
import Data.Maybe
import System.IO
import System.Posix.Files
import System.Locale
import System.Directory
import Data.Time.Clock.POSIX
import System.FilePath ((</>))
import Network.URI (unEscapeString)
import Data.Char (ord)
(>) = (>>>)
infixl 8 >
(+) = mplus
infixl 8 +
(/) :: FilePath -> FilePath -> FilePath
(/) = (</>)
infixl 5 /
empty_app :: Application
empty_app = return def
use :: [MiddleWare] -> MiddleWare
use = reduce (<<<)
bytesize :: String -> Int
bytesize = B.pack > B.length > from_i
dummy_middleware :: MiddleWare
dummy_middleware = id
dummy_app :: Application
dummy_app _ = return $ def { status = 500 }
escape_html = concatMap fixChar
where
fixChar '<' = "<"
fixChar '>' = ">"
fixChar '&' = "&"
fixChar '"' = "\""
fixChar c | ord c < 0x80 = [c]
fixChar c = "&#" ++ show (ord c) ++ ";"
show_status_code x = status_code.lookup x
now :: IO UTCTime
now = getCurrentTime
format_time :: String -> UTCTime -> String
format_time = formatTime defaultTimeLocale
interpolate :: String -> [(String, String)] -> String
interpolate s params = B.unpack $ substitute (B.pack s) (context params)
where
context = map packPair > to_h
packPair (x, y) = (B.pack x, B.pack y)
just_lookup s xs = xs.lookup s .fromJust
httpdate :: UTCTime -> String
httpdate x = x.format_time rfc822DateFormat where
file_size :: String -> IO Integer
file_size path = withFile (path.u2b) ReadMode hFileSize
file_mtime :: String -> IO UTCTime
file_mtime path = getFileStatus (path.u2b)
^ modificationTime ^ realToFrac ^ posixSecondsToUTCTime
read_binary_file :: String -> IO String
read_binary_file path = path.u2b.B.readFile ^ B.unpack
get_permissions :: String -> IO Permissions
get_permissions path = getPermissions (path.u2b)
url2unicode :: String -> String
url2unicode s = s.unEscapeString.b2u
get_current_directory :: IO String
get_current_directory = getCurrentDirectory ^ b2u