type action type effect type subscription type dispatch = (. action) => unit module Action = { module NoPayload = { external toState: ('s => 's) => action = "%identity" external toStateWithEffect: ('s => ('s, effect)) => action = "%identity" external toStateWithEffects2: ('s => ('s, effect, effect)) => action = "%identity" external toStateWithEffects3: ('s => ('s, effect, effect, effect)) => action = "%identity" external toAction: ('s => action) => action = "%identity" } module WithDomEvent = { external toState: (('s, 'ev) => 's) => action = "%identity" external toStateWithEffect: (('s, 'ev) => ('s, effect)) => action = "%identity" external toStateWithEffects2: (('s, 'ev) => ('s, effect, effect)) => action = "%identity" external toStateWithEffects3: (('s, 'ev) => ('s, effect, effect, effect)) => action = "%identity" external toAction: (('s, 'ev) => action) => action = "%identity" } module WithPayload = { external toState: ((('s, 'p) => 's, 'p)) => action = "%identity" external toStateWithEffect: ((('s, 'p) => ('s, effect), 'p)) => action = "%identity" external toStateWithEffects2: ((('s, 'p) => ('s, effect, effect), 'p)) => action = "%identity" external toStateWithEffects3: ((('s, 'p) => ('s, effect, effect, effect), 'p)) => action = "%identity" external toAction: ((('s, 'p) => action, 'p)) => action = "%identity" } } module Effect = { external noPayload: (dispatch => unit) => effect = "%identity" external withPayload: (((dispatch, 'p) => unit, 'p)) => effect = "%identity" let emptyEffectFn = _ => () let makeEmptyEffect = () => noPayload(emptyEffectFn) } module Subscription = { type cleanupFn = (. unit) => unit external noPayload: (dispatch => cleanupFn) => subscription = "%identity" external withPayload: (((dispatch, 'p) => cleanupFn, 'p)) => subscription = "%identity" } type vnode // TODO: Test that the activation/deactivation of subscriptions works correctly with option style type appArgs<'s> = { init: action, view: 's => vnode, node: Dom.element, subscriptions: option<'s => array>>, dispatch: option dispatch>, } @module("hyperapp") @val external app: appArgs<'s> => dispatch = "app" module H = { type props @obj external props: (~onchange: action=?, unit) => props = "" @module("hyperapp") @val external t: (string, props, array) => vnode = "h" } module Text = { @module("@hyperapp/html") @val external t: string => vnode = "text" } module Empty = { // h("", {}, []) does not work. // It evaluates to document.createElement("", ...), // which fails with `String contains an invalid character` due to the empty tag string. let t = (. ()) => Text.t("") } // @module("@hyperapp/html") @val external a: (props, array) => vnode = "a" // @module("@hyperapp/html") @val external b: (props, array) => vnode = "b" // @module("@hyperapp/html") @val external i: (props, array) => vnode = "i" module P = { type props @obj external p: unit => props = "" @module("@hyperapp/html") @val external t: (props, array) => vnode = "p" } // @module("@hyperapp/html") @val external q: (props, array) => vnode = "q" // @module("@hyperapp/html") @val external s: (props, array) => vnode = "s" // @module("@hyperapp/html") @val external br: (props, array) => vnode = "br" // @module("@hyperapp/html") @val external dd: (props, array) => vnode = "dd" // @module("@hyperapp/html") @val external dl: (props, array) => vnode = "dl" // @module("@hyperapp/html") @val external dt: (props, array) => vnode = "dt" // @module("@hyperapp/html") @val external em: (props, array) => vnode = "em" // @module("@hyperapp/html") @val external h1: (props, array) => vnode = "h1" // @module("@hyperapp/html") @val external h2: (props, array) => vnode = "h2" // @module("@hyperapp/html") @val external h3: (props, array) => vnode = "h3" // @module("@hyperapp/html") @val external h4: (props, array) => vnode = "h4" // @module("@hyperapp/html") @val external h5: (props, array) => vnode = "h5" // @module("@hyperapp/html") @val external h6: (props, array) => vnode = "h6" // @module("@hyperapp/html") @val external hr: (props, array) => vnode = "hr" // @module("@hyperapp/html") @val external li: (props, array) => vnode = "li" // @module("@hyperapp/html") @val external ol: (props, array) => vnode = "ol" // @module("@hyperapp/html") @val external rp: (props, array) => vnode = "rp" // @module("@hyperapp/html") @val external rt: (props, array) => vnode = "rt" // @module("@hyperapp/html") @val external td: (props, array) => vnode = "td" // @module("@hyperapp/html") @val external th: (props, array) => vnode = "th" // @module("@hyperapp/html") @val external tr: (props, array) => vnode = "tr" // @module("@hyperapp/html") @val external ul: (props, array) => vnode = "ul" // @module("@hyperapp/html") @val external bdi: (props, array) => vnode = "bdi" // @module("@hyperapp/html") @val external bdo: (props, array) => vnode = "bdo" // @module("@hyperapp/html") @val external col: (props, array) => vnode = "col" // @module("@hyperapp/html") @val external del: (props, array) => vnode = "del" // @module("@hyperapp/html") @val external dfn: (props, array) => vnode = "dfn" module Div = { type props @obj external p: (~id: string=?, ~class: string=?, unit) => props = "" @module("@hyperapp/html") @val external t: (props, array) => vnode = "div" } module Img = { type props @obj external p: (~src: string, ~alt: string, ~class: string=?, unit) => props = "" @module("@hyperapp/html") @val external t: props => vnode = "img" } // @module("@hyperapp/html") @val external ins: (props, array) => vnode = "ins" // @module("@hyperapp/html") @val external kbd: (props, array) => vnode = "kbd" // @module("@hyperapp/html") @val external map: (props, array) => vnode = "map" // @module("@hyperapp/html") @val external nav: (props, array) => vnode = "nav" // @module("@hyperapp/html") @val external pre: (props, array) => vnode = "pre" // @module("@hyperapp/html") @val external rtc: (props, array) => vnode = "rtc" // @module("@hyperapp/html") @val external sub: (props, array) => vnode = "sub" // @module("@hyperapp/html") @val external sup: (props, array) => vnode = "sup" // @module("@hyperapp/html") @val external wbr: (props, array) => vnode = "wbr" // @module("@hyperapp/html") @val external abbr: (props, array) => vnode = "abbr" // @module("@hyperapp/html") @val external area: (props, array) => vnode = "area" // @module("@hyperapp/html") @val external cite: (props, array) => vnode = "cite" // @module("@hyperapp/html") @val external code: (props, array) => vnode = "code" // @module("@hyperapp/html") @val external data: (props, array) => vnode = "data" // @module("@hyperapp/html") @val external form: (props, array) => vnode = "form" module Main = { type props @obj external p: unit => props = "" @module("@hyperapp/html") @val external t: (props, array) => vnode = "main" } // @module("@hyperapp/html") @val external mark: (props, array) => vnode = "mark" // @module("@hyperapp/html") @val external ruby: (props, array) => vnode = "ruby" // @module("@hyperapp/html") @val external samp: (props, array) => vnode = "samp" module Span = { type props @obj external p: unit => props = "" @module("@hyperapp/html") @val external t: (props, array) => vnode = "span" } // @module("@hyperapp/html") @val external time: (props, array) => vnode = "time" // @module("@hyperapp/html") @val external aside: (props, array) => vnode = "aside" // @module("@hyperapp/html") @val external audio: (props, array) => vnode = "audio" module Input = { type type_ = [ | #text | #radio | #checkbox ] @deriving(abstract) type p = { @as("type") type_: type_, @optional id: string, @optional value: string, @optional defaultValue: string, @optional checked: bool, @optional onchange: action, } @module("@hyperapp/html") @val external t: p => vnode = "input" } module Label = { type props @obj external p: unit => props = "" @module("@hyperapp/html") @val external t: (props, array) => vnode = "label" } // @module("@hyperapp/html") @val external meter: (props, array) => vnode = "meter" // @module("@hyperapp/html") @val external param: (props, array) => vnode = "param" // @module("@hyperapp/html") @val external small: (props, array) => vnode = "small" // @module("@hyperapp/html") @val external table: (props, array) => vnode = "table" // @module("@hyperapp/html") @val external tbody: (props, array) => vnode = "tbody" // @module("@hyperapp/html") @val external tfoot: (props, array) => vnode = "tfoot" // @module("@hyperapp/html") @val external thead: (props, array) => vnode = "thead" // @module("@hyperapp/html") @val external track: (props, array) => vnode = "track" // @module("@hyperapp/html") @val external video: (props, array) => vnode = "video" module Button = { type type_ = [ | #button | #submit | #reset ] @deriving(abstract) type p = { @as("type") type_: type_, @optional onclick: action, } @module("@hyperapp/html") @val external t: (p, array) => vnode = "button" } // @module("@hyperapp/html") @val external canvas: (props, array) => vnode = "canvas" // @module("@hyperapp/html") @val external dialog: (props, array) => vnode = "dialog" // @module("@hyperapp/html") @val external figure: (props, array) => vnode = "figure" // @module("@hyperapp/html") @val external footer: (props, array) => vnode = "footer" // @module("@hyperapp/html") @val external header: (props, array) => vnode = "header" // @module("@hyperapp/html") @val external iframe: (props, array) => vnode = "iframe" // @module("@hyperapp/html") @val external object: (props, array) => vnode = "object" // @module("@hyperapp/html") @val external option: (props, array) => vnode = "option" // @module("@hyperapp/html") @val external output: (props, array) => vnode = "output" // @module("@hyperapp/html") @val external select: (props, array) => vnode = "select" // @module("@hyperapp/html") @val external source: (props, array) => vnode = "source" // @module("@hyperapp/html") @val external strong: (props, array) => vnode = "strong" // @module("@hyperapp/html") @val external address: (props, array) => vnode = "address" // @module("@hyperapp/html") @val external article: (props, array) => vnode = "article" // @module("@hyperapp/html") @val external caption: (props, array) => vnode = "caption" // @module("@hyperapp/html") @val external details: (props, array) => vnode = "details" // @module("@hyperapp/html") @val external section: (props, array) => vnode = "section" // @module("@hyperapp/html") @val external summary: (props, array) => vnode = "summary" // @module("@hyperapp/html") @val external picture: (props, array) => vnode = "picture" // @module("@hyperapp/html") @val external colgroup: (props, array) => vnode = "colgroup" // @module("@hyperapp/html") @val external datalist: (props, array) => vnode = "datalist" module Fieldset = { type props @obj external p: unit => props = "" @module("@hyperapp/html") @val external t: (props, array) => vnode = "fieldset" } module Legend = { type props @obj external p: unit => props = "" @module("@hyperapp/html") @val external t: (props, array) => vnode = "legend" } // @module("@hyperapp/html") @val external menuitem: (props, array) => vnode = "menuitem" // @module("@hyperapp/html") @val external optgroup: (props, array) => vnode = "optgroup" // @module("@hyperapp/html") @val external progress: (props, array) => vnode = "progress" // @module("@hyperapp/html") @val external textarea: (props, array) => vnode = "textarea" // @module("@hyperapp/html") @val external blockquote: (props, array) => vnode = "blockquote" // @module("@hyperapp/html") @val external figcaption: (props, array) => vnode = "figcaption"