diff options
| -rw-r--r-- | erebos-webapp.cabal | 11 | ||||
| -rw-r--r-- | src/Main.hs | 51 | 
2 files changed, 59 insertions, 3 deletions
| diff --git a/erebos-webapp.cabal b/erebos-webapp.cabal index f8f988a..4fc3ca6 100644 --- a/erebos-webapp.cabal +++ b/erebos-webapp.cabal @@ -20,8 +20,17 @@ common warnings  executable erebos-webapp      import:           warnings      main-is:          Main.hs +    ghc-options: +        -no-hs-main +        -optl-mexec-model=reactor +        -optl-Wl,--export=hs_init,--export=setup +      -- other-modules: +      -- other-extensions: -    build-depends:    base ^>=4.17.2.1 +    build-depends: +        base ^>= { 4.21 }, +        ghc-experimental ^>= { 9.1201 }, +      hs-source-dirs:   src      default-language: GHC2021 diff --git a/src/Main.hs b/src/Main.hs index 65ae4a0..69276ac 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,4 +1,51 @@ -module Main where +module Main (main, setup) where + +import GHC.Wasm.Prim  main :: IO () -main = putStrLn "Hello, Haskell!" +main = error "unused" + +foreign export javascript setup :: IO () +setup :: IO () +setup = do +    body <- js_document_getElementById (toJSString "body") +    js_set_innerHTML body (toJSString "<input id=\"some_input\" type=\"text\" value=\"xyz\" /><button id=\"some_button\">add</button></div><div><ul id=\"some_list\"></ul></div>") + +    buttonElem <- js_document_getElementById (toJSString "some_button") +    buttonCallback <- asEventListener onButtonClick + +    js_addEventListener buttonElem (toJSString "click") buttonCallback + +onButtonClick :: JSVal -> IO () +onButtonClick _event = do +    inputElem <- js_document_getElementById (toJSString "some_input") +    listElem <- js_document_getElementById (toJSString "some_list") + +    li <- js_document_createElement (toJSString "li") +    content <- js_document_createTextNode =<< js_get_value inputElem +    js_appendChild li content +    js_appendChild listElem li + +foreign import javascript unsafe "document.getElementById($1)" +    js_document_getElementById :: JSString -> IO JSVal + +foreign import javascript unsafe "$1.innerHTML = $2" +    js_set_innerHTML :: JSVal -> JSString -> IO () + +foreign import javascript unsafe "$1.appendChild($2)" +    js_appendChild :: JSVal -> JSVal -> IO () + +foreign import javascript unsafe "document.createElement($1)" +    js_document_createElement :: JSString -> IO JSVal + +foreign import javascript unsafe "document.createTextNode($1)" +    js_document_createTextNode :: JSString -> IO JSVal + +foreign import javascript unsafe "$1.value" +    js_get_value :: JSVal -> IO JSString + +foreign import javascript unsafe "$1.addEventListener($2, $3)" +    js_addEventListener :: JSVal -> JSString -> JSVal -> IO () + +foreign import javascript "wrapper" +    asEventListener :: (JSVal -> IO ()) -> IO JSVal |