summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--erebos-webapp.cabal11
-rw-r--r--src/Main.hs51
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