packages feed

HFitUI-0.1.0.0: src/WebUI/Scripts/JavaScript/HJSFunction.hs

----------------------------------------------------------------
-- Модуль приложения
-- Скрипты графического интерфейса (HScript)
-- Функции языка JavaScript 
----------------------------------------------------------------

module WebUI.Scripts.JavaScript.HJSFunction
    ( HJsFunc   (..), functJS
    , HJsCall   (..), call
    , HJsNew    (..), newJS
    , HJsReturn (..), returnJS
    ) where

-- Импорт модулей
import           Prelude                                     as PRL

import           Data.Char                                      (toLower)
import           Data.String.Utils                              (strip)

import           WebUI.Scripts.HScript
import           WebUI.Scripts.JavaScript.HJSTypes
import           WebUI.Scripts.JavaScript.HJSBuilder
import           WebUI.Scripts.JavaScript.HJSUtils              (smartTabStr)



-- | Функция
data HJsFunc = forall f. (BuilderHSL f) => HJsFunc JsName [HLangJS] f


instance BuilderHSL HJsFunc where
    buildHSL hbConf (HJsFunc n args f) = 
        let nf = if (length n) == 0 then "" else n ++ " " in
        "function " ++ nf ++ "(" ++ "){" ++ (hbc_entryLine hbConf) ++
        (smartTabStr (buildHSL hbConf f) (hbc_tabSpace hbConf)) ++
        "}" ++ (hbc_entryLine hbConf)

    buildHSL_L hbConf (HJsFunc n _ _) = n
    buildHSL_R hbConf (HJsFunc _ _ f) = buildHSL hbConf f



-- | Новая функция
functJS :: JsName
        -> [HLangJS] 
        -> HSL HLangJS HLangJS 
        -> HSL HLangJS HLangJS
functJS name args fnHSL = do
    hbConf <- ask 
    s <- liftIO $ do (_, s, _) <- runRWST fnHSL hbConf HLangJS
                     return s
    fnc <- return $ HL $ HJsFunc name args s
    modify (:> fnc)
    return fnc



-- | Функция
data HJsCall = forall f a. (BuilderHSL f) => HJsCall f [HLangJS] 

instance BuilderHSL HJsCall where
    buildHSL hbConf (HJsCall f args) = 
        (buildHSL_L hbConf f) ++ "(" ++ (buildHSL_L hbConf args) ++ ")" ++ ";" ++ (hbc_entryLine hbConf)

    buildHSL_L hbConf (HJsCall f _   ) = buildHSL_L hbConf f
    buildHSL_R hbConf (HJsCall _ args) = buildHSL_R hbConf args



-- | Вызвать функцию
call :: (BuilderHSL f) 
     => f
     -> [HLangJS]
     -> HSL HLangJS HLangJS
call f args = do
    clf <- return $ HL $ HJsCall f args
    modify (:> clf)
    return clf 



-- | Синтаксис New
data HJsNew = forall n. (BuilderHSL n) => HJsNew n


instance BuilderHSL HJsNew where
    buildHSL hbConf (HJsNew n) = 
        "new " ++ (buildHSL hbConf n) ++ (hbc_entryLine hbConf)

    buildHSL_L hbConf (HJsNew  _) = "new "



-- | Новый синтаксис New
newJS :: HSL HLangJS HLangJS 
      -> HSL HLangJS HLangJS
newJS newHSL = do
    hbConf <- ask 
    s <- liftIO $ do (_, s, _) <- runRWST newHSL hbConf HLangJS
                     return s
    rn <- return $ HL $ HJsNew s
    modify (:> rn)
    return rn



-- | Синтаксис Return
data HJsReturn = forall r. (BuilderHSL r) => HJsReturn r


instance BuilderHSL HJsReturn where
    buildHSL hbConf (HJsReturn r) = 
        "return " ++ (buildHSL hbConf r) ++ ";" ++ (hbc_entryLine hbConf)

    buildHSL_L hbConf (HJsReturn  _) = "return "



-- | Новый синтаксис Return
returnJS :: HLangJS 
         -> HSL HLangJS HLangJS
returnJS ret = do
    rr <- return $ HL $ HJsReturn ret
    modify (:> rr)
    return HLangJS