miso

Native (mobile)

A minimal native component

The web counter from Your first Component translates line for line. Only the elements and the entry point change.

{-# LANGUAGE StaticPointers #-}
module Main where

import Miso
import Miso.Native

data Action = Increment | Decrement

app :: Component () () Int Action
app = component 0 update view

update :: Action -> Effect () () Int Action
update = \case
  Increment -> this += 1
  Decrement -> this -= 1

view :: () -> () -> Int -> View () Int Action
view _ _ m =
  vfrag
    [ view_ [ onTap Increment ] [ text_ [] [ "+" ] ]
    , text_ [] [ text (ms (show m)) ]
    , view_ [ onTap Decrement ] [ text_ [] [ "-" ] ]
    ]

main :: IO ()
main = native nativeEvents (static (mountStatic_ app))

view_ and text_ come from Miso.Native.Element; onTap from the element's event module. nativeEvents is the Lynx equivalent of defaultEvents. Everything else — component, Effect, lenses, vfrag — is exactly the web API.

More information on how to use miso natively is available on GitHub: haskell-miso/miso-lynx (with a gallery app) and the sphynx project demonstrating cross-thread communication.