{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE StaticPointers #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Miso.Types
(
App
, Component (..)
, ComponentId
, SomeComponent (..)
, SomeStaticComponent (..)
, EventHandler (..)
, View (..)
, Key (..)
, Attribute (..)
, Namespace (..)
, CSS (..)
, JS (..)
, LogLevel (..)
, VTree (..)
, VTreeType (..)
, Hydrate (..)
, Tag
, DirectEvents
, CacheBust
, MountPoint
, DOMRef
, Events
, Phase (..)
, URI (..)
, ToKey (..)
, emptyURI
, component
, event
, vcomp
, vcomp_
, (+>)
, mount_
, mountUseContext
, mountWithProps_
, mountWithProps
, mountStatic_
, mountStaticWithProps
, mountStaticUseContext
, fragment
, fragment_
, vfrag
, vfrag_
, getMountPoint
, optionalAttrs
, optionalVoidAttrs
, optionalChildren
, prettyURI
, prettyQueryString
, node
, nodeDirectEvents
, vnode
, text
, vtext
, text_
, textRaw
, textKey
, textKey_
, htmlEncode
, MisoString
, toMisoString
, fromMisoString
, ms
) where
import Data.Function
import qualified Data.Map.Strict as M
import Data.Set (Set)
import qualified Data.Set as S
import Data.Maybe (fromMaybe, isJust)
import Data.String (IsString, fromString)
import qualified Data.Text as T
import GHC.Generics
import GHC.StaticPtr
import Prelude
import Miso.DSL
import Miso.Effect (Effect, Sub, Sink, DOMRef, ComponentId)
import Miso.Event.Types
import qualified Miso.Event.Decoder
import Miso.JSON (Value, ToJSON(..), encode)
#ifdef NATIVE
import Miso.JSON (FromJSON(..))
#endif
import qualified Miso.String as MS
import Miso.String (ToMisoString, MisoString, toMisoString, ms, fromMisoString)
import Miso.CSS.Types (StyleSheet)
data Component context props model action
= Component
{ forall context props model action.
Component context props model action -> model
model :: model
, forall context props model action.
Component context props model action -> Maybe (IO model)
hydrateModel :: Maybe (IO model)
, forall context props model action.
Component context props model action
-> action -> Effect context props model action
update :: action -> Effect context props model action
, forall context props model action.
Component context props model action
-> context -> props -> model -> View context model action
view :: context -> props -> model -> View context model action
, forall context props model action.
Component context props model action -> Bool
useContext :: Bool
, forall context props model action.
Component context props model action -> [Sub action]
subs :: [ Sub action ]
, forall context props model action.
Component context props model action -> [CSS]
styles :: [CSS]
, forall context props model action.
Component context props model action -> [JS]
scripts :: [JS]
, forall context props model action.
Component context props model action -> Maybe MisoString
mountPoint :: Maybe MountPoint
, forall context props model action.
Component context props model action -> LogLevel
logLevel :: LogLevel
, forall context props model action.
Component context props model action -> Value -> Maybe action
mailbox :: Value -> Maybe action
, forall context props model action.
Component context props model action -> Bool
eventPropagation :: Bool
, forall context props model action.
Component context props model action -> Maybe action
mount :: Maybe action
, forall context props model action.
Component context props model action -> Maybe action
unmount :: Maybe action
, forall context props model action.
Component context props model action
-> Maybe (props -> props -> action)
onPropsChanged :: Maybe (props -> props -> action)
}
type MountPoint = MisoString
data CSS
= Href MisoString CacheBust
| Style MisoString
| Sheet StyleSheet
deriving (Int -> CSS -> ShowS
[CSS] -> ShowS
CSS -> String
(Int -> CSS -> ShowS)
-> (CSS -> String) -> ([CSS] -> ShowS) -> Show CSS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CSS -> ShowS
showsPrec :: Int -> CSS -> ShowS
$cshow :: CSS -> String
show :: CSS -> String
$cshowList :: [CSS] -> ShowS
showList :: [CSS] -> ShowS
Show, CSS -> CSS -> Bool
(CSS -> CSS -> Bool) -> (CSS -> CSS -> Bool) -> Eq CSS
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CSS -> CSS -> Bool
== :: CSS -> CSS -> Bool
$c/= :: CSS -> CSS -> Bool
/= :: CSS -> CSS -> Bool
Eq)
type CacheBust = Bool
data JS
= Src MisoString CacheBust
| Script MisoString
| Module MisoString
| ImportMap [(MisoString,MisoString)]
deriving (Int -> JS -> ShowS
[JS] -> ShowS
JS -> String
(Int -> JS -> ShowS)
-> (JS -> String) -> ([JS] -> ShowS) -> Show JS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> JS -> ShowS
showsPrec :: Int -> JS -> ShowS
$cshow :: JS -> String
show :: JS -> String
$cshowList :: [JS] -> ShowS
showList :: [JS] -> ShowS
Show, JS -> JS -> Bool
(JS -> JS -> Bool) -> (JS -> JS -> Bool) -> Eq JS
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: JS -> JS -> Bool
== :: JS -> JS -> Bool
$c/= :: JS -> JS -> Bool
/= :: JS -> JS -> Bool
Eq)
getMountPoint :: Maybe MisoString -> MisoString
getMountPoint :: Maybe MisoString -> MisoString
getMountPoint = MisoString -> Maybe MisoString -> MisoString
forall a. a -> Maybe a -> a
fromMaybe MisoString
"body"
component
:: model
-> (action -> Effect context props model action)
-> (context -> props -> model -> View context model action)
-> Component context props model action
component :: forall model action context props.
model
-> (action -> Effect context props model action)
-> (context -> props -> model -> View context model action)
-> Component context props model action
component model
m action -> Effect context props model action
u context -> props -> model -> View context model action
v = Component
{ model :: model
model = model
m
, hydrateModel :: Maybe (IO model)
hydrateModel = Maybe (IO model)
forall a. Maybe a
Nothing
, update :: action -> Effect context props model action
update = action -> Effect context props model action
u
, view :: context -> props -> model -> View context model action
view = context -> props -> model -> View context model action
v
, useContext :: Bool
useContext = Bool
False
, subs :: [Sub action]
subs = []
, styles :: [CSS]
styles = []
, scripts :: [JS]
scripts = []
, mountPoint :: Maybe MisoString
mountPoint = Maybe MisoString
forall a. Maybe a
Nothing
, logLevel :: LogLevel
logLevel = LogLevel
Off
, mailbox :: Value -> Maybe action
mailbox = Maybe action -> Value -> Maybe action
forall a b. a -> b -> a
const Maybe action
forall a. Maybe a
Nothing
, eventPropagation :: Bool
eventPropagation = Bool
False
, mount :: Maybe action
mount = Maybe action
forall a. Maybe a
Nothing
, unmount :: Maybe action
unmount = Maybe action
forall a. Maybe a
Nothing
, onPropsChanged :: Maybe (props -> props -> action)
onPropsChanged = Maybe (props -> props -> action)
forall a. Maybe a
Nothing
}
type App model action = Component () () model action
data LogLevel
= Off
| DebugHydrate
| DebugEvents
| DebugAll
deriving (Int -> LogLevel -> ShowS
[LogLevel] -> ShowS
LogLevel -> String
(Int -> LogLevel -> ShowS)
-> (LogLevel -> String) -> ([LogLevel] -> ShowS) -> Show LogLevel
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LogLevel -> ShowS
showsPrec :: Int -> LogLevel -> ShowS
$cshow :: LogLevel -> String
show :: LogLevel -> String
$cshowList :: [LogLevel] -> ShowS
showList :: [LogLevel] -> ShowS
Show, LogLevel -> LogLevel -> Bool
(LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> Bool) -> Eq LogLevel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LogLevel -> LogLevel -> Bool
== :: LogLevel -> LogLevel -> Bool
$c/= :: LogLevel -> LogLevel -> Bool
/= :: LogLevel -> LogLevel -> Bool
Eq)
type Tag = MisoString
type DirectEvents = Set MisoString
data View context model action
= VNode Namespace Tag [Attribute model action] [View context model action] DirectEvents
| VText (Maybe Key) MisoString
| VComp (SomeComponent context)
| forall props . VCompStatic (StaticPtr (SomeStaticComponent props context)) props
| VFrag (Maybe Key) [View context model action]
data SomeComponent context
#ifdef NATIVE
= forall model action props . (FromJSON model, ToJSON model, FromJSON action, ToJSON action, FromJSON props, ToJSON props, Eq context, Eq model, Eq props)
#else
= forall model action props . (Eq context, Eq model, Eq props)
#endif
=> SomeComponent (Maybe Key) props (Component context props model action)
data SomeStaticComponent props context
#ifdef NATIVE
= (Eq props, FromJSON props, ToJSON props)
=> SomeStaticComponent (props -> SomeComponent context)
#else
= Eq props
=> SomeStaticComponent (props -> SomeComponent context)
#endif
vfrag :: [View context model action] -> View context model action
vfrag :: forall context model action.
[View context model action] -> View context model action
vfrag = [View context model action] -> View context model action
forall context model action.
[View context model action] -> View context model action
fragment
fragment :: [View context model action] -> View context model action
fragment :: forall context model action.
[View context model action] -> View context model action
fragment = Maybe Key
-> [View context model action] -> View context model action
forall context model action.
Maybe Key
-> [View context model action] -> View context model action
VFrag Maybe Key
forall a. Maybe a
Nothing
vfrag_ :: MisoString -> [View context model action] -> View context model action
vfrag_ :: forall context model action.
MisoString
-> [View context model action] -> View context model action
vfrag_ MisoString
key = Maybe Key
-> [View context model action] -> View context model action
forall context model action.
Maybe Key
-> [View context model action] -> View context model action
VFrag (Key -> Maybe Key
forall a. a -> Maybe a
Just (MisoString -> Key
Key MisoString
key))
fragment_ :: MisoString -> [View context model action] -> View context model action
fragment_ :: forall context model action.
MisoString
-> [View context model action] -> View context model action
fragment_ MisoString
key = Maybe Key
-> [View context model action] -> View context model action
forall context model action.
Maybe Key
-> [View context model action] -> View context model action
VFrag (Key -> Maybe Key
forall a. a -> Maybe a
Just (MisoString -> Key
Key MisoString
key))
(+>)
:: forall context childModel childAction model action .
#ifdef NATIVE
(Eq context, Eq childModel, FromJSON childModel, ToJSON childModel, FromJSON childAction, ToJSON childAction)
#else
(Eq context, Eq childModel)
#endif
=> MisoString
-> Component context () childModel childAction
-> View context model action
infixr 0 +>
#ifdef NATIVE
{-# WARNING (+>) "[NATIVE] '+>' has no StaticKey; a component mounted with it after the initial frame silently drops OnStatic handlers inside it. Use 'vcomp' with 'mountStaticWithProps' instead." #-}
#endif
MisoString
key +> :: forall context childModel childAction model action.
(Eq context, Eq childModel, FromJSON childModel, ToJSON childModel,
FromJSON childAction, ToJSON childAction) =>
MisoString
-> Component context () childModel childAction
-> View context model action
+> Component context () childModel childAction
child = SomeComponent context -> View context model action
forall context model action.
SomeComponent context -> View context model action
VComp (Maybe Key
-> ()
-> Component context () childModel childAction
-> SomeComponent context
forall context model action props.
(FromJSON model, ToJSON model, FromJSON action, ToJSON action,
FromJSON props, ToJSON props, Eq context, Eq model, Eq props) =>
Maybe Key
-> props
-> Component context props model action
-> SomeComponent context
SomeComponent (Key -> Maybe Key
forall a. a -> Maybe a
Just (MisoString -> Key
forall key. ToKey key => key -> Key
toKey MisoString
key)) () Component context () childModel childAction
child)
mountStaticWithProps
#ifdef NATIVE
:: (Eq context, Eq props, Eq model, FromJSON model, ToJSON model, FromJSON action, ToJSON action, FromJSON props, ToJSON props)
#else
:: (Eq context, Eq props, Eq model)
#endif
=> Component context props model action
-> SomeStaticComponent props context
mountStaticWithProps :: forall context props model action.
(Eq context, Eq props, Eq model, FromJSON model, ToJSON model,
FromJSON action, ToJSON action, FromJSON props, ToJSON props) =>
Component context props model action
-> SomeStaticComponent props context
mountStaticWithProps Component context props model action
child = (props -> SomeComponent context)
-> SomeStaticComponent props context
forall props context.
(Eq props, FromJSON props, ToJSON props) =>
(props -> SomeComponent context)
-> SomeStaticComponent props context
SomeStaticComponent (\props
props -> Maybe Key
-> props
-> Component context props model action
-> SomeComponent context
forall context model action props.
(FromJSON model, ToJSON model, FromJSON action, ToJSON action,
FromJSON props, ToJSON props, Eq context, Eq model, Eq props) =>
Maybe Key
-> props
-> Component context props model action
-> SomeComponent context
SomeComponent Maybe Key
forall a. Maybe a
Nothing props
props Component context props model action
child)
mountWithProps
:: forall context props childModel childAction model action .
#ifdef NATIVE
(Eq context, Eq props, Eq childModel, FromJSON childModel, ToJSON childModel, FromJSON childAction, ToJSON childAction, FromJSON props, ToJSON props)
#else
(Eq context, Eq props, Eq childModel)
#endif
=> props
-> Component context props childModel childAction
-> View context model action
#ifdef NATIVE
{-# WARNING mountWithProps "[NATIVE] 'mountWithProps' has no StaticKey; a component mounted with it after the initial frame silently drops OnStatic handlers inside it. Use 'vcomp' with 'mountStaticWithProps' instead." #-}
#endif
mountWithProps :: forall context props childModel childAction model action.
(Eq context, Eq props, Eq childModel, FromJSON childModel,
ToJSON childModel, FromJSON childAction, ToJSON childAction,
FromJSON props, ToJSON props) =>
props
-> Component context props childModel childAction
-> View context model action
mountWithProps props
props Component context props childModel childAction
comp = SomeComponent context -> View context model action
forall context model action.
SomeComponent context -> View context model action
VComp (Maybe Key
-> props
-> Component context props childModel childAction
-> SomeComponent context
forall context model action props.
(FromJSON model, ToJSON model, FromJSON action, ToJSON action,
FromJSON props, ToJSON props, Eq context, Eq model, Eq props) =>
Maybe Key
-> props
-> Component context props model action
-> SomeComponent context
SomeComponent Maybe Key
forall a. Maybe a
Nothing props
props Component context props childModel childAction
comp)
mountWithProps_
:: forall context props childModel childAction model action .
#ifdef NATIVE
(Eq context, Eq props, Eq childModel, FromJSON childAction, FromJSON childModel, ToJSON childModel, ToJSON childAction, FromJSON props, ToJSON props)
#else
(Eq context, Eq childModel, Eq props)
#endif
=> MisoString
-> props
-> Component context props childModel childAction
-> View context model action
#ifdef NATIVE
{-# WARNING mountWithProps_ "[NATIVE] 'mountWithProps_' has no StaticKey; a component mounted with it after the initial frame silently drops OnStatic handlers inside it. Use 'vcomp' with 'mountStaticWithProps' instead." #-}
#endif
mountWithProps_ :: forall context props childModel childAction model action.
(Eq context, Eq props, Eq childModel, FromJSON childAction,
FromJSON childModel, ToJSON childModel, ToJSON childAction,
FromJSON props, ToJSON props) =>
MisoString
-> props
-> Component context props childModel childAction
-> View context model action
mountWithProps_ MisoString
key props
props Component context props childModel childAction
child = SomeComponent context -> View context model action
forall context model action.
SomeComponent context -> View context model action
VComp (Maybe Key
-> props
-> Component context props childModel childAction
-> SomeComponent context
forall context model action props.
(FromJSON model, ToJSON model, FromJSON action, ToJSON action,
FromJSON props, ToJSON props, Eq context, Eq model, Eq props) =>
Maybe Key
-> props
-> Component context props model action
-> SomeComponent context
SomeComponent (Key -> Maybe Key
forall a. a -> Maybe a
Just (MisoString -> Key
Key MisoString
key)) props
props Component context props childModel childAction
child)
mountStatic_
#ifdef NATIVE
:: (Eq context, Eq model, FromJSON model, ToJSON model, FromJSON action, ToJSON action)
#else
:: (Eq context, Eq model)
#endif
=> Component context () model action
-> SomeStaticComponent () context
mountStatic_ :: forall context model action.
(Eq context, Eq model, FromJSON model, ToJSON model,
FromJSON action, ToJSON action) =>
Component context () model action -> SomeStaticComponent () context
mountStatic_ Component context () model action
child = (() -> SomeComponent context) -> SomeStaticComponent () context
forall props context.
(Eq props, FromJSON props, ToJSON props) =>
(props -> SomeComponent context)
-> SomeStaticComponent props context
SomeStaticComponent (SomeComponent context -> () -> SomeComponent context
forall a b. a -> b -> a
const (Maybe Key
-> () -> Component context () model action -> SomeComponent context
forall context model action props.
(FromJSON model, ToJSON model, FromJSON action, ToJSON action,
FromJSON props, ToJSON props, Eq context, Eq model, Eq props) =>
Maybe Key
-> props
-> Component context props model action
-> SomeComponent context
SomeComponent Maybe Key
forall a. Maybe a
Nothing () Component context () model action
child))
mount_
:: forall context childModel childAction model action .
#ifdef NATIVE
(Eq context, Eq childModel, FromJSON childModel, ToJSON childModel, FromJSON childAction, ToJSON childAction)
#else
(Eq context, Eq childModel)
#endif
=> Component context () childModel childAction
-> View context model action
#ifdef NATIVE
{-# WARNING mount_ "[NATIVE] 'mount_' has no StaticKey; a component mounted with it after the initial frame silently drops OnStatic handlers inside it. Use 'vcomp_' with 'mountStatic_' instead." #-}
#endif
mount_ :: forall context childModel childAction model action.
(Eq context, Eq childModel, FromJSON childModel, ToJSON childModel,
FromJSON childAction, ToJSON childAction) =>
Component context () childModel childAction
-> View context model action
mount_ Component context () childModel childAction
comp = SomeComponent context -> View context model action
forall context model action.
SomeComponent context -> View context model action
VComp (Maybe Key
-> ()
-> Component context () childModel childAction
-> SomeComponent context
forall context model action props.
(FromJSON model, ToJSON model, FromJSON action, ToJSON action,
FromJSON props, ToJSON props, Eq context, Eq model, Eq props) =>
Maybe Key
-> props
-> Component context props model action
-> SomeComponent context
SomeComponent Maybe Key
forall a. Maybe a
Nothing () Component context () childModel childAction
comp)
vcomp
:: props
-> StaticPtr (SomeStaticComponent props context)
-> View context model action
vcomp :: forall props context model action.
props
-> StaticPtr (SomeStaticComponent props context)
-> View context model action
vcomp = (StaticPtr (SomeStaticComponent props context)
-> props -> View context model action)
-> props
-> StaticPtr (SomeStaticComponent props context)
-> View context model action
forall a b c. (a -> b -> c) -> b -> a -> c
flip StaticPtr (SomeStaticComponent props context)
-> props -> View context model action
forall context model action props.
StaticPtr (SomeStaticComponent props context)
-> props -> View context model action
VCompStatic
vcomp_
:: StaticPtr (SomeStaticComponent () context)
-> View context model action
vcomp_ :: forall context model action.
StaticPtr (SomeStaticComponent () context)
-> View context model action
vcomp_ = ()
-> StaticPtr (SomeStaticComponent () context)
-> View context model action
forall props context model action.
props
-> StaticPtr (SomeStaticComponent props context)
-> View context model action
vcomp ()
mountStaticUseContext
#ifdef NATIVE
:: (Eq context, Eq model, FromJSON model, ToJSON model, FromJSON action, ToJSON action)
#else
:: (Eq context, Eq model)
#endif
=> Component context () model action
-> SomeStaticComponent () context
mountStaticUseContext :: forall context model action.
(Eq context, Eq model, FromJSON model, ToJSON model,
FromJSON action, ToJSON action) =>
Component context () model action -> SomeStaticComponent () context
mountStaticUseContext Component context () model action
child =
(() -> SomeComponent context) -> SomeStaticComponent () context
forall props context.
(Eq props, FromJSON props, ToJSON props) =>
(props -> SomeComponent context)
-> SomeStaticComponent props context
SomeStaticComponent (SomeComponent context -> () -> SomeComponent context
forall a b. a -> b -> a
const (Maybe Key
-> () -> Component context () model action -> SomeComponent context
forall context model action props.
(FromJSON model, ToJSON model, FromJSON action, ToJSON action,
FromJSON props, ToJSON props, Eq context, Eq model, Eq props) =>
Maybe Key
-> props
-> Component context props model action
-> SomeComponent context
SomeComponent Maybe Key
forall a. Maybe a
Nothing () Component context () model action
child { useContext = True }))
mountUseContext
:: forall context childModel childAction model action .
#ifdef NATIVE
(Eq context, Eq childModel, FromJSON childModel, ToJSON childModel, FromJSON childAction, ToJSON childAction)
#else
(Eq context, Eq childModel)
#endif
=> Component context () childModel childAction
-> View context model action
#ifdef NATIVE
{-# WARNING mountUseContext "[NATIVE] 'mountUseContext' has no StaticKey; a component mounted with it after the initial frame silently drops OnStatic handlers inside it. Use 'vcomp_' with 'mountStaticUseContext' instead." #-}
#endif
mountUseContext :: forall context childModel childAction model action.
(Eq context, Eq childModel, FromJSON childModel, ToJSON childModel,
FromJSON childAction, ToJSON childAction) =>
Component context () childModel childAction
-> View context model action
mountUseContext Component context () childModel childAction
comp = SomeComponent context -> View context model action
forall context model action.
SomeComponent context -> View context model action
VComp (Maybe Key
-> ()
-> Component context () childModel childAction
-> SomeComponent context
forall context model action props.
(FromJSON model, ToJSON model, FromJSON action, ToJSON action,
FromJSON props, ToJSON props, Eq context, Eq model, Eq props) =>
Maybe Key
-> props
-> Component context props model action
-> SomeComponent context
SomeComponent Maybe Key
forall a. Maybe a
Nothing () Component context () childModel childAction
comp { useContext = True })
data Namespace
= HTML
| SVG
| MATHML
deriving (Int -> Namespace -> ShowS
[Namespace] -> ShowS
Namespace -> String
(Int -> Namespace -> ShowS)
-> (Namespace -> String)
-> ([Namespace] -> ShowS)
-> Show Namespace
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Namespace -> ShowS
showsPrec :: Int -> Namespace -> ShowS
$cshow :: Namespace -> String
show :: Namespace -> String
$cshowList :: [Namespace] -> ShowS
showList :: [Namespace] -> ShowS
Show, Namespace -> Namespace -> Bool
(Namespace -> Namespace -> Bool)
-> (Namespace -> Namespace -> Bool) -> Eq Namespace
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Namespace -> Namespace -> Bool
== :: Namespace -> Namespace -> Bool
$c/= :: Namespace -> Namespace -> Bool
/= :: Namespace -> Namespace -> Bool
Eq)
instance ToJSVal Namespace where
toJSVal :: Namespace -> IO JSVal
toJSVal = \case
Namespace
SVG -> MisoString -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
toJSVal (MisoString
"svg" :: MisoString)
Namespace
HTML -> MisoString -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
toJSVal (MisoString
"html" :: MisoString)
Namespace
MATHML -> MisoString -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
toJSVal (MisoString
"mathml" :: MisoString)
newtype Key = Key MisoString
deriving newtype (Int -> Key -> ShowS
[Key] -> ShowS
Key -> String
(Int -> Key -> ShowS)
-> (Key -> String) -> ([Key] -> ShowS) -> Show Key
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Key -> ShowS
showsPrec :: Int -> Key -> ShowS
$cshow :: Key -> String
show :: Key -> String
$cshowList :: [Key] -> ShowS
showList :: [Key] -> ShowS
Show, Key -> Key -> Bool
(Key -> Key -> Bool) -> (Key -> Key -> Bool) -> Eq Key
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Key -> Key -> Bool
== :: Key -> Key -> Bool
$c/= :: Key -> Key -> Bool
/= :: Key -> Key -> Bool
Eq, String -> Key
(String -> Key) -> IsString Key
forall a. (String -> a) -> IsString a
$cfromString :: String -> Key
fromString :: String -> Key
IsString, [Key] -> Value
Key -> Value
(Key -> Value) -> ([Key] -> Value) -> ToJSON Key
forall a. (a -> Value) -> ([a] -> Value) -> ToJSON a
$ctoJSON :: Key -> Value
toJSON :: Key -> Value
$ctoJSONList :: [Key] -> Value
toJSONList :: [Key] -> Value
ToJSON, Key -> MisoString
(Key -> MisoString) -> ToMisoString Key
forall str. (str -> MisoString) -> ToMisoString str
$ctoMisoString :: Key -> MisoString
toMisoString :: Key -> MisoString
ToMisoString)
instance ToJSVal Key where
toJSVal :: Key -> IO JSVal
toJSVal (Key MisoString
x) = MisoString -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
toJSVal MisoString
x
class ToKey key where
toKey :: key -> Key
instance ToKey Key where toKey :: Key -> Key
toKey = Key -> Key
forall a. a -> a
id
#ifndef VANILLA
instance ToKey MisoString where toKey = Key
#endif
instance ToKey T.Text where toKey :: MisoString -> Key
toKey = MisoString -> Key
Key (MisoString -> Key)
-> (MisoString -> MisoString) -> MisoString -> Key
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MisoString -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString
instance ToKey String where toKey :: String -> Key
toKey = MisoString -> Key
Key (MisoString -> Key) -> (String -> MisoString) -> String -> Key
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString
instance ToKey Int where toKey :: Int -> Key
toKey = MisoString -> Key
Key (MisoString -> Key) -> (Int -> MisoString) -> Int -> Key
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString
instance ToKey Double where toKey :: Double -> Key
toKey = MisoString -> Key
Key (MisoString -> Key) -> (Double -> MisoString) -> Double -> Key
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString
instance ToKey Float where toKey :: Float -> Key
toKey = MisoString -> Key
Key (MisoString -> Key) -> (Float -> MisoString) -> Float -> Key
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString
instance ToKey Word where toKey :: Word -> Key
toKey = MisoString -> Key
Key (MisoString -> Key) -> (Word -> MisoString) -> Word -> Key
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString
data EventHandler model action = forall result. EventHandler
{ forall model action.
EventHandler model action
-> model -> Sink action -> VTree -> LogLevel -> Events -> IO ()
eventHandlerInstall :: model -> Sink action -> VTree -> LogLevel -> Events -> IO ()
, ()
eventHandlerDecoder :: Miso.Event.Decoder.Decoder result
, ()
eventHandlerConvert :: result -> model -> DOMRef -> action
}
event :: StaticPtr (EventHandler model action) -> Attribute model action
event :: forall model action.
StaticPtr (EventHandler model action) -> Attribute model action
event = StaticPtr (EventHandler model action) -> Attribute model action
forall model action.
StaticPtr (EventHandler model action) -> Attribute model action
OnStatic
data Attribute model action
= Property MisoString Value
| ClassList [MisoString]
| On (model -> Sink action -> VTree -> LogLevel -> Events -> IO ())
| OnStatic (StaticPtr (EventHandler model action))
| Styles (M.Map MisoString MisoString)
instance Eq (Attribute model action) where
Property MisoString
k1 Value
v1 == :: Attribute model action -> Attribute model action -> Bool
== Property MisoString
k2 Value
v2 = MisoString
k1 MisoString -> MisoString -> Bool
forall a. Eq a => a -> a -> Bool
== MisoString
k2 Bool -> Bool -> Bool
&& Value
v1 Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
== Value
v2
ClassList [MisoString]
x == ClassList [MisoString]
y = [MisoString]
x [MisoString] -> [MisoString] -> Bool
forall a. Eq a => a -> a -> Bool
== [MisoString]
y
Styles Map MisoString MisoString
x == Styles Map MisoString MisoString
y = Map MisoString MisoString
x Map MisoString MisoString -> Map MisoString MisoString -> Bool
forall a. Eq a => a -> a -> Bool
== Map MisoString MisoString
y
OnStatic StaticPtr (EventHandler model action)
ptr1 == OnStatic StaticPtr (EventHandler model action)
ptr2 = (StaticKey -> StaticKey -> Bool)
-> (StaticPtr (EventHandler model action) -> StaticKey)
-> StaticPtr (EventHandler model action)
-> StaticPtr (EventHandler model action)
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
on StaticKey -> StaticKey -> Bool
forall a. Eq a => a -> a -> Bool
(==) StaticPtr (EventHandler model action) -> StaticKey
forall a. StaticPtr a -> StaticKey
staticKey StaticPtr (EventHandler model action)
ptr1 StaticPtr (EventHandler model action)
ptr2
Attribute model action
_ == Attribute model action
_ = Bool
False
instance Show (Attribute model action) where
show :: Attribute model action -> String
show = \case
Property MisoString
key Value
value ->
MisoString -> String
MS.unpack MisoString
key String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"=" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> MisoString -> String
MS.unpack (MisoString -> MisoString
forall str. ToMisoString str => str -> MisoString
ms (Value -> MisoString
forall a. ToJSON a => a -> MisoString
encode Value
value))
ClassList [MisoString]
classes ->
MisoString -> String
MS.unpack (MisoString -> [MisoString] -> MisoString
MS.intercalate MisoString
" " [MisoString]
classes)
On model -> Sink action -> VTree -> LogLevel -> Events -> IO ()
_ ->
String
"<event-handler>"
OnStatic StaticPtr (EventHandler model action)
ptr ->
String
"<event-handler-with: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> StaticKey -> String
forall a. Show a => a -> String
show (StaticPtr (EventHandler model action) -> StaticKey
forall a. StaticPtr a -> StaticKey
staticKey StaticPtr (EventHandler model action)
ptr) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
">"
Styles Map MisoString MisoString
styles ->
MisoString -> String
MS.unpack (MisoString -> String) -> MisoString -> String
forall a b. (a -> b) -> a -> b
$ [MisoString] -> MisoString
MS.concat
[ MisoString
k MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
"=" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
v MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
";"
| (MisoString
k, MisoString
v) <- Map MisoString MisoString -> [(MisoString, MisoString)]
forall k a. Map k a -> [(k, a)]
M.toList Map MisoString MisoString
styles
]
instance IsString (View context model action) where
fromString :: String -> View context model action
fromString = Maybe Key -> MisoString -> View context model action
forall context model action.
Maybe Key -> MisoString -> View context model action
VText Maybe Key
forall a. Maybe a
Nothing (MisoString -> View context model action)
-> (String -> MisoString) -> String -> View context model action
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> MisoString
forall a. IsString a => String -> a
fromString
newtype VTree = VTree
{ VTree -> Object
getTree :: Object
} deriving newtype (VTree -> IO Object
(VTree -> IO Object) -> ToObject VTree
forall a. (a -> IO Object) -> ToObject a
$ctoObject :: VTree -> IO Object
toObject :: VTree -> IO Object
ToObject, VTree -> IO JSVal
(VTree -> IO JSVal) -> ToJSVal VTree
forall a. (a -> IO JSVal) -> ToJSVal a
$ctoJSVal :: VTree -> IO JSVal
toJSVal :: VTree -> IO JSVal
ToJSVal)
node
:: Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> View context model action
node :: forall model action context.
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> View context model action
node Namespace
ns MisoString
tag [Attribute model action]
attrs [View context model action]
kids = Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
forall context model action.
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
VNode Namespace
ns MisoString
tag [Attribute model action]
attrs [View context model action]
kids DirectEvents
forall a. Monoid a => a
mempty
nodeDirectEvents
:: Namespace
-> MisoString
-> [Attribute model action]
-> [MisoString]
-> [View context model action]
-> View context model action
nodeDirectEvents :: forall model action context.
Namespace
-> MisoString
-> [Attribute model action]
-> [MisoString]
-> [View context model action]
-> View context model action
nodeDirectEvents Namespace
ns MisoString
tag [Attribute model action]
attrs [MisoString]
direct [View context model action]
kids = Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
forall context model action.
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
VNode Namespace
ns MisoString
tag [Attribute model action]
attrs [View context model action]
kids ([MisoString] -> DirectEvents
forall a. Ord a => [a] -> Set a
S.fromList [MisoString]
direct)
vnode
:: Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> View context model action
vnode :: forall model action context.
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> View context model action
vnode = Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> View context model action
forall model action context.
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> View context model action
node
text :: MisoString -> View context model action
#ifdef SSR
text = VText Nothing . htmlEncode
#else
text :: forall context model action.
MisoString -> View context model action
text = Maybe Key -> MisoString -> View context model action
forall context model action.
Maybe Key -> MisoString -> View context model action
VText Maybe Key
forall a. Maybe a
Nothing
#endif
vtext :: MisoString -> View context model action
vtext :: forall context model action.
MisoString -> View context model action
vtext = MisoString -> View context model action
forall context model action.
MisoString -> View context model action
text
textRaw :: MisoString -> View context model action
= Maybe Key -> MisoString -> View context model action
forall context model action.
Maybe Key -> MisoString -> View context model action
VText Maybe Key
forall a. Maybe a
Nothing
htmlEncode :: MisoString -> MisoString
htmlEncode :: MisoString -> MisoString
htmlEncode = (Char -> MisoString) -> MisoString -> MisoString
MS.concatMap ((Char -> MisoString) -> MisoString -> MisoString)
-> (Char -> MisoString) -> MisoString -> MisoString
forall a b. (a -> b) -> a -> b
$ \case
Char
'<' -> MisoString
"<"
Char
'>' -> MisoString
">"
Char
'&' -> MisoString
"&"
Char
'"' -> MisoString
"""
Char
'\'' -> MisoString
"'"
Char
x -> Char -> MisoString
MS.singleton Char
x
text_ :: [MisoString] -> View context model action
text_ :: forall context model action.
[MisoString] -> View context model action
text_ = Maybe Key -> MisoString -> View context model action
forall context model action.
Maybe Key -> MisoString -> View context model action
VText Maybe Key
forall a. Maybe a
Nothing (MisoString -> View context model action)
-> ([MisoString] -> MisoString)
-> [MisoString]
-> View context model action
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MisoString -> [MisoString] -> MisoString
MS.intercalate MisoString
" "
textKey :: ToKey key => key -> MisoString -> View context model action
textKey :: forall key context model action.
ToKey key =>
key -> MisoString -> View context model action
textKey key
k = Maybe Key -> MisoString -> View context model action
forall context model action.
Maybe Key -> MisoString -> View context model action
VText (Key -> Maybe Key
forall a. a -> Maybe a
Just (key -> Key
forall key. ToKey key => key -> Key
toKey key
k))
textKey_ :: ToKey key => key -> [MisoString] -> View context model action
textKey_ :: forall key context model action.
ToKey key =>
key -> [MisoString] -> View context model action
textKey_ key
k [MisoString]
xs = Maybe Key -> MisoString -> View context model action
forall context model action.
Maybe Key -> MisoString -> View context model action
VText (Key -> Maybe Key
forall a. a -> Maybe a
Just (key -> Key
forall key. ToKey key => key -> Key
toKey key
k)) (MisoString -> [MisoString] -> MisoString
MS.intercalate MisoString
" " [MisoString]
xs)
optionalAttrs
:: ([Attribute model action] -> [View context model action] -> View context model action)
-> [Attribute model action]
-> Bool
-> [Attribute model action]
-> [View context model action]
-> View context model action
optionalAttrs :: forall model action context.
([Attribute model action]
-> [View context model action] -> View context model action)
-> [Attribute model action]
-> Bool
-> [Attribute model action]
-> [View context model action]
-> View context model action
optionalAttrs [Attribute model action]
-> [View context model action] -> View context model action
element [Attribute model action]
attrs Bool
condition [Attribute model action]
opts [View context model action]
kids =
case [Attribute model action]
-> [View context model action] -> View context model action
element [Attribute model action]
attrs [View context model action]
kids of
VNode Namespace
ns MisoString
name [Attribute model action]
_ [View context model action]
_ DirectEvents
de -> do
let newAttrs :: [Attribute model action]
newAttrs = [[Attribute model action]] -> [Attribute model action]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ [Attribute model action]
opts | Bool
condition ] [Attribute model action]
-> [Attribute model action] -> [Attribute model action]
forall a. [a] -> [a] -> [a]
++ [Attribute model action]
attrs
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
forall context model action.
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
VNode Namespace
ns MisoString
name [Attribute model action]
newAttrs [View context model action]
kids DirectEvents
de
View context model action
x -> View context model action
x
optionalVoidAttrs
:: ([Attribute model action] -> View context model action)
-> [Attribute model action]
-> Bool
-> [Attribute model action]
-> View context model action
optionalVoidAttrs :: forall model action context.
([Attribute model action] -> View context model action)
-> [Attribute model action]
-> Bool
-> [Attribute model action]
-> View context model action
optionalVoidAttrs [Attribute model action] -> View context model action
element [Attribute model action]
attrs Bool
condition [Attribute model action]
opts =
case [Attribute model action] -> View context model action
element [Attribute model action]
attrs of
VNode Namespace
ns MisoString
name [Attribute model action]
_ [View context model action]
kids DirectEvents
de -> do
let newAttrs :: [Attribute model action]
newAttrs = [[Attribute model action]] -> [Attribute model action]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ [Attribute model action]
opts | Bool
condition ] [Attribute model action]
-> [Attribute model action] -> [Attribute model action]
forall a. [a] -> [a] -> [a]
++ [Attribute model action]
attrs
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
forall context model action.
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
VNode Namespace
ns MisoString
name [Attribute model action]
newAttrs [View context model action]
kids DirectEvents
de
View context model action
x -> View context model action
x
optionalChildren
:: ([Attribute model action] -> [View context model action] -> View context model action)
-> [Attribute model action]
-> [View context model action]
-> Bool
-> [View context model action]
-> View context model action
optionalChildren :: forall model action context.
([Attribute model action]
-> [View context model action] -> View context model action)
-> [Attribute model action]
-> [View context model action]
-> Bool
-> [View context model action]
-> View context model action
optionalChildren [Attribute model action]
-> [View context model action] -> View context model action
element [Attribute model action]
attrs [View context model action]
kids Bool
condition [View context model action]
opts =
case [Attribute model action]
-> [View context model action] -> View context model action
element [Attribute model action]
attrs [View context model action]
kids of
VNode Namespace
ns MisoString
name [Attribute model action]
_ [View context model action]
_ DirectEvents
de -> do
let newKids :: [View context model action]
newKids = [View context model action]
kids [View context model action]
-> [View context model action] -> [View context model action]
forall a. [a] -> [a] -> [a]
++ [[View context model action]] -> [View context model action]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ [View context model action]
opts | Bool
condition ]
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
forall context model action.
Namespace
-> MisoString
-> [Attribute model action]
-> [View context model action]
-> DirectEvents
-> View context model action
VNode Namespace
ns MisoString
name [Attribute model action]
attrs [View context model action]
newKids DirectEvents
de
View context model action
x -> View context model action
x
data URI
= URI
{ URI -> MisoString
uriPath :: MisoString
, URI -> MisoString
uriFragment :: MisoString
, URI -> Map MisoString (Maybe MisoString)
uriQueryString :: M.Map MisoString (Maybe MisoString)
} deriving stock (Int -> URI -> ShowS
[URI] -> ShowS
URI -> String
(Int -> URI -> ShowS)
-> (URI -> String) -> ([URI] -> ShowS) -> Show URI
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> URI -> ShowS
showsPrec :: Int -> URI -> ShowS
$cshow :: URI -> String
show :: URI -> String
$cshowList :: [URI] -> ShowS
showList :: [URI] -> ShowS
Show, URI -> URI -> Bool
(URI -> URI -> Bool) -> (URI -> URI -> Bool) -> Eq URI
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: URI -> URI -> Bool
== :: URI -> URI -> Bool
$c/= :: URI -> URI -> Bool
/= :: URI -> URI -> Bool
Eq, (forall x. URI -> Rep URI x)
-> (forall x. Rep URI x -> URI) -> Generic URI
forall x. Rep URI x -> URI
forall x. URI -> Rep URI x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. URI -> Rep URI x
from :: forall x. URI -> Rep URI x
$cto :: forall x. Rep URI x -> URI
to :: forall x. Rep URI x -> URI
Generic)
deriving anyclass (URI -> IO JSVal
(URI -> IO JSVal) -> ToJSVal URI
forall a. (a -> IO JSVal) -> ToJSVal a
$ctoJSVal :: URI -> IO JSVal
toJSVal :: URI -> IO JSVal
ToJSVal, URI -> IO Object
(URI -> IO Object) -> ToObject URI
forall a. (a -> IO Object) -> ToObject a
$ctoObject :: URI -> IO Object
toObject :: URI -> IO Object
ToObject)
emptyURI :: URI
emptyURI :: URI
emptyURI = MisoString
-> MisoString -> Map MisoString (Maybe MisoString) -> URI
URI MisoString
forall a. Monoid a => a
mempty MisoString
forall a. Monoid a => a
mempty Map MisoString (Maybe MisoString)
forall a. Monoid a => a
mempty
instance ToMisoString URI where
toMisoString :: URI -> MisoString
toMisoString = URI -> MisoString
prettyURI
instance ToJSON URI where
toJSON :: URI -> Value
toJSON = MisoString -> Value
forall a. ToJSON a => a -> Value
toJSON (MisoString -> Value) -> (URI -> MisoString) -> URI -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. URI -> MisoString
forall str. ToMisoString str => str -> MisoString
toMisoString
prettyURI :: URI -> MisoString
prettyURI :: URI -> MisoString
prettyURI uri :: URI
uri@URI {Map MisoString (Maybe MisoString)
MisoString
uriPath :: URI -> MisoString
uriFragment :: URI -> MisoString
uriQueryString :: URI -> Map MisoString (Maybe MisoString)
uriPath :: MisoString
uriFragment :: MisoString
uriQueryString :: Map MisoString (Maybe MisoString)
..} = MisoString
"/" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
uriPath MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> URI -> MisoString
prettyQueryString URI
uri MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
uriFragment
prettyQueryString :: URI -> MisoString
prettyQueryString :: URI -> MisoString
prettyQueryString URI {Map MisoString (Maybe MisoString)
MisoString
uriPath :: URI -> MisoString
uriFragment :: URI -> MisoString
uriQueryString :: URI -> Map MisoString (Maybe MisoString)
uriPath :: MisoString
uriFragment :: MisoString
uriQueryString :: Map MisoString (Maybe MisoString)
..} = MisoString
queries MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
flags
where
queries :: MisoString
queries =
[MisoString] -> MisoString
MS.concat
[ MisoString
"?" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<>
MisoString -> [MisoString] -> MisoString
MS.intercalate MisoString
"&"
[ MisoString
k MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
"=" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
v
| (MisoString
k, Just MisoString
v) <- Map MisoString (Maybe MisoString)
-> [(MisoString, Maybe MisoString)]
forall k a. Map k a -> [(k, a)]
M.toList Map MisoString (Maybe MisoString)
uriQueryString
]
| (Maybe MisoString -> Bool) -> [Maybe MisoString] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Maybe MisoString -> Bool
forall a. Maybe a -> Bool
isJust (Map MisoString (Maybe MisoString) -> [Maybe MisoString]
forall k a. Map k a -> [a]
M.elems Map MisoString (Maybe MisoString)
uriQueryString)
]
flags :: MisoString
flags = [MisoString] -> MisoString
forall a. Monoid a => [a] -> a
mconcat
[ MisoString
"?" MisoString -> MisoString -> MisoString
forall a. Semigroup a => a -> a -> a
<> MisoString
k
| (MisoString
k, Maybe MisoString
Nothing) <- Map MisoString (Maybe MisoString)
-> [(MisoString, Maybe MisoString)]
forall k a. Map k a -> [(k, a)]
M.toList Map MisoString (Maybe MisoString)
uriQueryString
]
data VTreeType
= VCompType
| VNodeType
| VTextType
| VFragType
deriving (Int -> VTreeType -> ShowS
[VTreeType] -> ShowS
VTreeType -> String
(Int -> VTreeType -> ShowS)
-> (VTreeType -> String)
-> ([VTreeType] -> ShowS)
-> Show VTreeType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> VTreeType -> ShowS
showsPrec :: Int -> VTreeType -> ShowS
$cshow :: VTreeType -> String
show :: VTreeType -> String
$cshowList :: [VTreeType] -> ShowS
showList :: [VTreeType] -> ShowS
Show, VTreeType -> VTreeType -> Bool
(VTreeType -> VTreeType -> Bool)
-> (VTreeType -> VTreeType -> Bool) -> Eq VTreeType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: VTreeType -> VTreeType -> Bool
== :: VTreeType -> VTreeType -> Bool
$c/= :: VTreeType -> VTreeType -> Bool
/= :: VTreeType -> VTreeType -> Bool
Eq)
instance ToJSVal VTreeType where
toJSVal :: VTreeType -> IO JSVal
toJSVal = \case
VTreeType
VCompType -> Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
toJSVal (Int
0 :: Int)
VTreeType
VNodeType -> Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
toJSVal (Int
1 :: Int)
VTreeType
VTextType -> Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
toJSVal (Int
2 :: Int)
VTreeType
VFragType -> Int -> IO JSVal
forall a. ToJSVal a => a -> IO JSVal
toJSVal (Int
3 :: Int)
data Hydrate
= Draw
| Hydrate
deriving (Int -> Hydrate -> ShowS
[Hydrate] -> ShowS
Hydrate -> String
(Int -> Hydrate -> ShowS)
-> (Hydrate -> String) -> ([Hydrate] -> ShowS) -> Show Hydrate
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Hydrate -> ShowS
showsPrec :: Int -> Hydrate -> ShowS
$cshow :: Hydrate -> String
show :: Hydrate -> String
$cshowList :: [Hydrate] -> ShowS
showList :: [Hydrate] -> ShowS
Show, Hydrate -> Hydrate -> Bool
(Hydrate -> Hydrate -> Bool)
-> (Hydrate -> Hydrate -> Bool) -> Eq Hydrate
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Hydrate -> Hydrate -> Bool
== :: Hydrate -> Hydrate -> Bool
$c/= :: Hydrate -> Hydrate -> Bool
/= :: Hydrate -> Hydrate -> Bool
Eq)