packages feed

yesod-angular-ui-0.1.0.0: src/Yesod/AngularUI/Router.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE RecordWildCards   #-}
{-# Language LambdaCase        #-}
{-# LANGUAGE TemplateHaskell   #-}
{-# Language ViewPatterns      #-}
{-# Language BangPatterns      #-}
{-# Language CPP      #-}

module Yesod.AngularUI.Router where

import Data.Text (Text)
import Text.Hamlet
import Text.Julius
import Text.Lucius
import Text.Cassius
import Text.Naked.Coffee
import Text.TypeScript

import Language.Haskell.TH.Lib (ExpQ)
import qualified Data.Text as T
import Data.Either
import Prelude
import Control.Monad

import System.Directory (doesFileExist)
import System.IO.Unsafe (unsafePerformIO)

isRight :: Either a b -> Bool
isRight (Right _) = True
isRight _ = False

whenRight :: (Functor f, Monad f) => Either t t1 -> (t1 -> f a) -> f ()
whenRight (Right a) b = void $ b a
whenRight _ _ = return ()

fnCreate :: Text -> Text -> Text -> String
fnCreate (T.null -> True)  (T.replace "@" "AT" -> nam) suffix = T.unpack $ T.concat ["angular/", nam , ".", suffix]
fnCreate parent            (T.unpack -> "")            suffix = T.unpack $ T.concat ["angular/", T.replace "." "/" parent, ".", suffix]
fnCreate parent            (T.replace "@" "AT" -> nam) suffix = T.unpack $ T.concat ["angular/", T.replace "." "/" parent, ".", nam, ".", suffix]


autoMaybe :: (String -> ExpQ) -> Text -> Text -> Text -> Maybe ExpQ
autoMaybe ex ext state view =
    let fn = fnCreate state view ext
    in
    if unsafePerformIO $ doesFileExist fn
       then Just [| $(ex fn) |]
       else Nothing
{-# NOINLINE autoMaybe #-}

autoHamlet :: Text -> Text -> ExpQ
autoHamlet state view = do
  let fn = fnCreate state view "hamlet"
#if DEVELOPMENT
  let !boo = unsafePerformIO $ print fn
#endif
  if unsafePerformIO $ doesFileExist fn
    then  [| $(ihamletFile fn) |]
    else  [| [ihamlet| <!-- #{fn} --> |] |]
{-# NOINLINE autoHamlet #-}

autoJulius :: Text -> Text -> Maybe ExpQ
autoJulius = autoMaybe juliusFile "julius"

autoCassius :: Text -> Text -> Maybe  ExpQ
autoCassius = autoMaybe cassiusFile "cassius"

autoLucius :: Text -> Text -> Maybe ExpQ
autoLucius = autoMaybe luciusFile "lucius"

autoCoffee :: Text -> Text -> Maybe ExpQ
autoCoffee = autoMaybe ncoffeeFile "coffee"

autoTypeScript :: Text -> Text -> Maybe ExpQ
autoTypeScript = autoMaybe typeScriptFile "tsc"