Module

Bonsai

Package
purescript-bonsai
Repository
grmble/purescript-bonsai

Bonsai main module for imports

View code will also want Bonsai.Html and Bonsai.Event

Re-exports from Bonsai.Core

#UpdateResult Source

type UpdateResult aff model msg = { cmd :: Cmd aff msg, model :: model }

An update functions returns a new model and a possibly empty command

#ProgramState Source

type ProgramState model msg = { dirty :: Boolean, dnode :: Element, model :: model, vnode :: VNode msg }

ProgramState tracks the current state of the model, vnode and dom element.

These are needed to advance the state in reaction to a Cmd message.

#Program Source

type Program aff model msg = { dbgEvents :: Boolean, dbgTiming :: Boolean, pending :: Ref (Array msg), renderer :: model -> VNode msg, state :: Ref (ProgramState model msg), updater :: model -> msg -> UpdateResult aff model msg }

Program describes the Bonsai program.

It is passed around in a ReaderT and stores callbacks and a ref to the pending commands. Event callbacks append to the list of pending commands, they will then be applied in the main event loop.

#program Source

program :: forall msg model aff eff. Element -> (model -> msg -> UpdateResult aff model msg) -> (model -> VNode msg) -> model -> Eff (console :: CONSOLE, dom :: DOM, ref :: REF | eff) (Program aff model msg)

Create initial environment for the Bonsai program.

#plainResult Source

plainResult :: forall msg model aff. model -> UpdateResult aff model msg

Creates an update result with empty command.

#mapResult Source

mapResult :: forall msg2 model2 msg1 model1 aff. (model1 -> model2) -> (msg1 -> msg2) -> UpdateResult aff model1 msg1 -> UpdateResult aff model2 msg2

Helper to map update results from sub-components

#emitMessages Source

emitMessages :: forall msg aff. TaskContext aff (Array msg) -> Array msg -> Aff aff Unit

Emit helper for Tasks.

#debugProgram Source

debugProgram :: forall msg model aff eff. Element -> Boolean -> Boolean -> (model -> msg -> UpdateResult aff model msg) -> (model -> VNode msg) -> model -> Eff (console :: CONSOLE, dom :: DOM, ref :: REF | eff) (Program aff model msg)

Re-exports from Bonsai.DOM

#domElementById Source

domElementById :: forall eff. ElementId -> Eff (dom :: DOM | eff) (Maybe Element)

Gets a DOM Element by its ID

Re-exports from Bonsai.Types

#EventDecoder Source

type EventDecoder msg = Foreign -> BrowserEvent msg

A EventDecoder decodes a foreign to a BrowserEvent

#Cmd Source

data Cmd eff msg

A Command represents messages that should be applied to the Bonsai model

A command is either Pure (the constructor Cmd) or an asynchronous Task. The pure command simply contains the messages that will be emitted. The asynchronous Task gets an emitter function that it can use to emit messages at will.

There is currently no effectful synchronous command - there used to be, but it did not turn out very useful except in dumbed down examples.

There could be a helper function that expresses simple effectful commands as Tasks though.

There used to be a helper type for TaskContext -> Aff but for some reason it did not unify in user code. So the recommendation is to produce the command, not the function with complicated signature that goes inside a TaskCmd.

Constructors

Instances

#simpleTask Source

simpleTask :: forall msg aff. Aff aff (Array msg) -> Cmd aff msg

Produces a simple task (not cancellable, ony emits the return values

#readerTask Source

readerTask :: forall msg aff. (TaskContext aff (Array msg) -> Aff aff (Array msg)) -> Cmd aff msg

Procudes a task that can emit multiple times

#pureCommand Source

pureCommand :: forall msg aff. msg -> Cmd aff msg

Produces a pure command

#emptyCommand Source

emptyCommand :: forall msg aff. Cmd aff msg

Produces an empty command.