packages feed

glazier-react-widget 0.2.0.0 → 0.3.0.0

raw patch · 6 files changed

+355/−105 lines, 6 filesdep ~glazier-reactPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: glazier-react

API changes (from Hackage documentation)

- Glazier.React.Widgets.Input: GetPropertyAction :: JSString -> (JSVal -> act) -> Action act
- Glazier.React.Widgets.Input: GetPropertyCommand :: JSString -> JSVal -> (JSVal -> act) -> Command act
- Glazier.React.Widgets.Input: _GetPropertyAction :: AsAction r_aq4Q act_apXn => Prism' r_aq4Q (JSString, JSVal -> act_apXn)
- Glazier.React.Widgets.Input: data Widget act
- Glazier.React.Widgets.Input: instance GHC.Base.Functor Glazier.React.Widgets.Input.Action
- Glazier.React.Widgets.Input: instance GHC.Base.Functor Glazier.React.Widgets.Input.Command
- Glazier.React.Widgets.Input: instance Glazier.React.Widget.IsWidget (Glazier.React.Widgets.Input.Widget act)
- Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.AsAction (Glazier.React.Widgets.Input.Action act0) act0
- Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.HasModel (Glazier.React.Widget.Design Glazier.React.Widgets.Input.Model Glazier.React.Widgets.Input.Plan)
- Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.HasModel (Glazier.React.Widget.SuperModel Glazier.React.Widgets.Input.Model Glazier.React.Widgets.Input.Plan)
- Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.HasPlan (Glazier.React.Widget.Design Glazier.React.Widgets.Input.Model Glazier.React.Widgets.Input.Plan)
- Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.HasPlan (Glazier.React.Widget.SuperModel Glazier.React.Widgets.Input.Model Glazier.React.Widgets.Input.Plan)
- Glazier.React.Widgets.Input: mkSuperModel :: Model -> F (Maker (Action act)) (SuperModel act)
- Glazier.React.Widgets.Input: type Replica act = WidgetReplica (Widget act)
- Glazier.React.Widgets.List: data Widget key itemWidget
- Glazier.React.Widgets.List: instance (Control.Disposable.Disposing (Glazier.React.Widget.WidgetPlan itemWidget), Control.Disposable.Disposing (Glazier.React.Widget.WidgetModel itemWidget)) => Control.Disposable.Disposing (Glazier.React.Widgets.List.Model key itemWidget)
- Glazier.React.Widgets.List: instance Glazier.React.Widget.IsWidget (Glazier.React.Widgets.List.Widget key itemWidget)
- Glazier.React.Widgets.List: instance Glazier.React.Widgets.List.HasModel (Glazier.React.Widget.Design (Glazier.React.Widgets.List.Model key itemWidget) Glazier.React.Widgets.List.Plan) key itemWidget
- Glazier.React.Widgets.List: instance Glazier.React.Widgets.List.HasModel (Glazier.React.Widget.SuperModel (Glazier.React.Widgets.List.Model key itemWidget) Glazier.React.Widgets.List.Plan) key itemWidget
- Glazier.React.Widgets.List: instance Glazier.React.Widgets.List.HasPlan (Glazier.React.Widget.Design (Glazier.React.Widgets.List.Model key itemWidget) Glazier.React.Widgets.List.Plan)
- Glazier.React.Widgets.List: instance Glazier.React.Widgets.List.HasPlan (Glazier.React.Widget.SuperModel (Glazier.React.Widgets.List.Model key itemWidget) Glazier.React.Widgets.List.Plan)
- Glazier.React.Widgets.List: mkSuperModel :: WindowT (WidgetDesign itemWidget) (ReactMlT Identity) () -> ReactMlT Identity () -> Model key itemWidget -> F (Maker (Action key itemWidget)) (SuperModel key itemWidget)
- Glazier.React.Widgets.List: type Replica key itemWidget = WidgetReplica (Widget key itemWidget)
+ Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.AsAction Glazier.React.Widgets.Input.Action
+ Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.HasModel (Glazier.React.Model.Design Glazier.React.Widgets.Input.Model Glazier.React.Widgets.Input.Plan)
+ Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.HasModel (Glazier.React.Model.SuperModel Glazier.React.Widgets.Input.Model Glazier.React.Widgets.Input.Plan)
+ Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.HasPlan (Glazier.React.Model.Design Glazier.React.Widgets.Input.Model Glazier.React.Widgets.Input.Plan)
+ Glazier.React.Widgets.Input: instance Glazier.React.Widgets.Input.HasPlan (Glazier.React.Model.SuperModel Glazier.React.Widgets.Input.Model Glazier.React.Widgets.Input.Plan)
+ Glazier.React.Widgets.Input: type Frame = Frame Model Plan
+ Glazier.React.Widgets.Input: type Widget = Widget Command Action Model Plan
+ Glazier.React.Widgets.Input: widget :: Widget Command Action Model Plan
+ Glazier.React.Widgets.List: instance Control.Disposable.Disposing (Glazier.React.Widget.SuperModelOf itemWidget) => Control.Disposable.Disposing (Glazier.React.Widgets.List.Model key itemWidget)
+ Glazier.React.Widgets.List: instance Glazier.React.Widgets.List.HasModel (Glazier.React.Model.Design (Glazier.React.Widgets.List.Model key itemWidget) Glazier.React.Widgets.List.Plan) key itemWidget
+ Glazier.React.Widgets.List: instance Glazier.React.Widgets.List.HasModel (Glazier.React.Model.SuperModel (Glazier.React.Widgets.List.Model key itemWidget) Glazier.React.Widgets.List.Plan) key itemWidget
+ Glazier.React.Widgets.List: instance Glazier.React.Widgets.List.HasPlan (Glazier.React.Model.Design (Glazier.React.Widgets.List.Model key itemWidget) Glazier.React.Widgets.List.Plan)
+ Glazier.React.Widgets.List: instance Glazier.React.Widgets.List.HasPlan (Glazier.React.Model.SuperModel (Glazier.React.Widgets.List.Model key itemWidget) Glazier.React.Widgets.List.Plan)
+ Glazier.React.Widgets.List: type Frame key itemWidget = Frame (Model key itemWidget) Plan
+ Glazier.React.Widgets.List: type Widget key itemWidget = Widget (Command key itemWidget) (Action key itemWidget) (Model key itemWidget) Plan
+ Glazier.React.Widgets.List: widget :: (IsWidget itemWidget, Ord key) => ReactMlT Identity () -> itemWidget -> Widget (Command key itemWidget) (Action key itemWidget) (Model key itemWidget) Plan
- Glazier.React.Widgets.Input: InputRefAction :: JSVal -> Action act
+ Glazier.React.Widgets.Input: InputRefAction :: JSVal -> Action
- Glazier.React.Widgets.Input: SendCommandsAction :: [Command act] -> Action act
+ Glazier.React.Widgets.Input: SendCommandsAction :: [Command] -> Action
- Glazier.React.Widgets.Input: SetPropertyCommand :: Property -> JSVal -> Command act
+ Glazier.React.Widgets.Input: SetPropertyCommand :: Property -> JSVal -> Command
- Glazier.React.Widgets.Input: SubmitAction :: JSString -> Action act
+ Glazier.React.Widgets.Input: SubmitAction :: JSString -> Action
- Glazier.React.Widgets.Input: _Action :: AsAction r_aq4Q act_apXn => Prism' r_aq4Q (Action act_apXn)
+ Glazier.React.Widgets.Input: _Action :: AsAction r_aq5M => Prism' r_aq5M Action
- Glazier.React.Widgets.Input: _InputRefAction :: AsAction r_aq4Q act_apXn => Prism' r_aq4Q JSVal
+ Glazier.React.Widgets.Input: _InputRefAction :: AsAction r_aq5M => Prism' r_aq5M JSVal
- Glazier.React.Widgets.Input: _SendCommandsAction :: AsAction r_aq4Q act_apXn => Prism' r_aq4Q [Command act_apXn]
+ Glazier.React.Widgets.Input: _SendCommandsAction :: AsAction r_aq5M => Prism' r_aq5M [Command]
- Glazier.React.Widgets.Input: _SubmitAction :: AsAction r_aq4Q act_apXn => Prism' r_aq4Q JSString
+ Glazier.React.Widgets.Input: _SubmitAction :: AsAction r_aq5M => Prism' r_aq5M JSString
- Glazier.React.Widgets.Input: class AsAction r_aq4Q act_apXn | r_aq4Q -> act_apXn where _SendCommandsAction = (.) _Action _SendCommandsAction _SubmitAction = (.) _Action _SubmitAction _InputRefAction = (.) _Action _InputRefAction _GetPropertyAction = (.) _Action _GetPropertyAction
+ Glazier.React.Widgets.Input: class AsAction r_aq5M where _SendCommandsAction = (.) _Action _SendCommandsAction _SubmitAction = (.) _Action _SubmitAction _InputRefAction = (.) _Action _InputRefAction
- Glazier.React.Widgets.Input: class HasModel c_aqeQ where className = (.) model className inputRef = (.) model inputRef placeholder = (.) model placeholder uid = (.) model uid
+ Glazier.React.Widgets.Input: class HasModel c_aqe0 where className = (.) model className inputRef = (.) model inputRef placeholder = (.) model placeholder uid = (.) model uid
- Glazier.React.Widgets.Input: class HasPlan c_aqaO where component = (.) plan component onInputRef = (.) plan onInputRef onKeyDown = (.) plan onKeyDown onRender = (.) plan onRender
+ Glazier.React.Widgets.Input: class HasPlan c_aq9Y where component = (.) plan component onInputRef = (.) plan onInputRef onKeyDown = (.) plan onKeyDown onRender = (.) plan onRender
- Glazier.React.Widgets.Input: className :: HasModel c_aqeQ => Lens' c_aqeQ JSString
+ Glazier.React.Widgets.Input: className :: HasModel c_aqe0 => Lens' c_aqe0 JSString
- Glazier.React.Widgets.Input: component :: HasPlan c_aqaO => Lens' c_aqaO ReactComponent
+ Glazier.React.Widgets.Input: component :: HasPlan c_aq9Y => Lens' c_aq9Y ReactComponent
- Glazier.React.Widgets.Input: data Action act
+ Glazier.React.Widgets.Input: data Action
- Glazier.React.Widgets.Input: data Command act
+ Glazier.React.Widgets.Input: data Command
- Glazier.React.Widgets.Input: gadget :: Monad m => GadgetT (Action act) (SuperModel act) m (DList (Command act))
+ Glazier.React.Widgets.Input: gadget :: GadgetT Action (SuperModel Model Plan) Identity (DList Command)
- Glazier.React.Widgets.Input: inputRef :: HasModel c_aqeQ => Lens' c_aqeQ JSVal
+ Glazier.React.Widgets.Input: inputRef :: HasModel c_aqe0 => Lens' c_aqe0 JSVal
- Glazier.React.Widgets.Input: mkPlan :: Replica Model Plan -> F (Maker (Action act)) Plan
+ Glazier.React.Widgets.Input: mkPlan :: Frame Model Plan -> F (Maker Action) Plan
- Glazier.React.Widgets.Input: model :: HasModel c_aqeQ => Lens' c_aqeQ Model
+ Glazier.React.Widgets.Input: model :: HasModel c_aqe0 => Lens' c_aqe0 Model
- Glazier.React.Widgets.Input: onInputRef :: HasPlan c_aqaO => Lens' c_aqaO (Callback (JSVal -> IO ()))
+ Glazier.React.Widgets.Input: onInputRef :: HasPlan c_aq9Y => Lens' c_aq9Y (Callback (JSVal -> IO ()))
- Glazier.React.Widgets.Input: onKeyDown :: HasPlan c_aqaO => Lens' c_aqaO (Callback (JSVal -> IO ()))
+ Glazier.React.Widgets.Input: onKeyDown :: HasPlan c_aq9Y => Lens' c_aq9Y (Callback (JSVal -> IO ()))
- Glazier.React.Widgets.Input: onRender :: HasPlan c_aqaO => Lens' c_aqaO (Callback (JSVal -> IO JSVal))
+ Glazier.React.Widgets.Input: onRender :: HasPlan c_aq9Y => Lens' c_aq9Y (Callback (JSVal -> IO JSVal))
- Glazier.React.Widgets.Input: placeholder :: HasModel c_aqeQ => Lens' c_aqeQ JSString
+ Glazier.React.Widgets.Input: placeholder :: HasModel c_aqe0 => Lens' c_aqe0 JSString
- Glazier.React.Widgets.Input: plan :: HasPlan c_aqaO => Lens' c_aqaO Plan
+ Glazier.React.Widgets.Input: plan :: HasPlan c_aq9Y => Lens' c_aq9Y Plan
- Glazier.React.Widgets.Input: type Design act = WidgetDesign (Widget act)
+ Glazier.React.Widgets.Input: type Design = Design Model Plan
- Glazier.React.Widgets.Input: type SuperModel act = WidgetSuperModel (Widget act)
+ Glazier.React.Widgets.Input: type SuperModel = SuperModel Model Plan
- Glazier.React.Widgets.Input: uid :: HasModel c_aqeQ => Lens' c_aqeQ JSString
+ Glazier.React.Widgets.Input: uid :: HasModel c_aqe0 => Lens' c_aqe0 JSString
- Glazier.React.Widgets.Input: window :: Monad m => WindowT (Design act) (ReactMlT m) ()
+ Glazier.React.Widgets.Input: window :: WindowT (Design Model Plan) (ReactMlT Identity) ()
- Glazier.React.Widgets.Input.Run: run :: Output act -> Command act -> IO ()
+ Glazier.React.Widgets.Input.Run: run :: Command -> IO ()
- Glazier.React.Widgets.List: AddItemAction :: key -> (WidgetSuperModel itemWidget) -> Action key itemWidget
+ Glazier.React.Widgets.List: AddItemAction :: key -> (SuperModelOf itemWidget) -> Action key itemWidget
- Glazier.React.Widgets.List: ItemAction :: key -> (WidgetAction itemWidget) -> Action key itemWidget
+ Glazier.React.Widgets.List: ItemAction :: key -> (ActionOf itemWidget) -> Action key itemWidget
- Glazier.React.Widgets.List: ItemCommand :: key -> (WidgetCommand itemWidget) -> Command key itemWidget
+ Glazier.React.Widgets.List: ItemCommand :: key -> (CommandOf itemWidget) -> Command key itemWidget
- Glazier.React.Widgets.List: MakeItemAction :: (key -> key) -> (key -> F (Maker (WidgetAction itemWidget)) (WidgetModel itemWidget)) -> Action key itemWidget
+ Glazier.React.Widgets.List: MakeItemAction :: (key -> key) -> (key -> F (Maker (ActionOf itemWidget)) (ModelOf itemWidget)) -> Action key itemWidget
- Glazier.React.Widgets.List: Model :: JSString -> JSVal -> Int -> DList (Command key itemWidget) -> JSString -> key -> Map key (WidgetSuperModel itemWidget) -> (WidgetSuperModel itemWidget -> Bool) -> Model key itemWidget
+ Glazier.React.Widgets.List: Model :: JSString -> JSVal -> Int -> DList (Command key itemWidget) -> JSString -> key -> Map key (SuperModelOf itemWidget) -> (SuperModelOf itemWidget -> Bool) -> Model key itemWidget
- Glazier.React.Widgets.List: SetFilterAction :: (WidgetSuperModel itemWidget -> Bool) -> Action key itemWidget
+ Glazier.React.Widgets.List: SetFilterAction :: (SuperModelOf itemWidget -> Bool) -> Action key itemWidget
- Glazier.React.Widgets.List: [_itemsFilter] :: Model key itemWidget -> WidgetSuperModel itemWidget -> Bool
+ Glazier.React.Widgets.List: [_itemsFilter] :: Model key itemWidget -> SuperModelOf itemWidget -> Bool
- Glazier.React.Widgets.List: [_itemsModel] :: Model key itemWidget -> Map key (WidgetSuperModel itemWidget)
+ Glazier.React.Widgets.List: [_itemsModel] :: Model key itemWidget -> Map key (SuperModelOf itemWidget)
- Glazier.React.Widgets.List: _Action :: AsAction r_acqq key_a9Du itemWidget_a9Dv => Prism' r_acqq (Action key_a9Du itemWidget_a9Dv)
+ Glazier.React.Widgets.List: _Action :: AsAction r_ahp7 key_agXR itemWidget_agXS => Prism' r_ahp7 (Action key_agXR itemWidget_agXS)
- Glazier.React.Widgets.List: _AddItemAction :: AsAction r_acqq key_a9Du itemWidget_a9Dv => Prism' r_acqq (key_a9Du, WidgetSuperModel itemWidget_a9Dv)
+ Glazier.React.Widgets.List: _AddItemAction :: AsAction r_ahp7 key_agXR itemWidget_agXS => Prism' r_ahp7 (key_agXR, SuperModelOf itemWidget_agXS)
- Glazier.React.Widgets.List: _ComponentDidUpdateAction :: AsAction r_acqq key_a9Du itemWidget_a9Dv => Prism' r_acqq ()
+ Glazier.React.Widgets.List: _ComponentDidUpdateAction :: AsAction r_ahp7 key_agXR itemWidget_agXS => Prism' r_ahp7 ()
- Glazier.React.Widgets.List: _ComponentRefAction :: AsAction r_acqq key_a9Du itemWidget_a9Dv => Prism' r_acqq JSVal
+ Glazier.React.Widgets.List: _ComponentRefAction :: AsAction r_ahp7 key_agXR itemWidget_agXS => Prism' r_ahp7 JSVal
- Glazier.React.Widgets.List: _DestroyItemAction :: AsAction r_acqq key_a9Du itemWidget_a9Dv => Prism' r_acqq key_a9Du
+ Glazier.React.Widgets.List: _DestroyItemAction :: AsAction r_ahp7 key_agXR itemWidget_agXS => Prism' r_ahp7 key_agXR
- Glazier.React.Widgets.List: _ItemAction :: AsAction r_acqq key_a9Du itemWidget_a9Dv => Prism' r_acqq (key_a9Du, WidgetAction itemWidget_a9Dv)
+ Glazier.React.Widgets.List: _ItemAction :: AsAction r_ahp7 key_agXR itemWidget_agXS => Prism' r_ahp7 (key_agXR, ActionOf itemWidget_agXS)
- Glazier.React.Widgets.List: _MakeItemAction :: AsAction r_acqq key_a9Du itemWidget_a9Dv => Prism' r_acqq (key_a9Du -> key_a9Du, key_a9Du -> F (Maker (WidgetAction itemWidget_a9Dv)) (WidgetModel itemWidget_a9Dv))
+ Glazier.React.Widgets.List: _MakeItemAction :: AsAction r_ahp7 key_agXR itemWidget_agXS => Prism' r_ahp7 (key_agXR -> key_agXR, key_agXR -> F (Maker (ActionOf itemWidget_agXS)) (ModelOf itemWidget_agXS))
- Glazier.React.Widgets.List: _RenderAction :: AsAction r_acqq key_a9Du itemWidget_a9Dv => Prism' r_acqq ()
+ Glazier.React.Widgets.List: _RenderAction :: AsAction r_ahp7 key_agXR itemWidget_agXS => Prism' r_ahp7 ()
- Glazier.React.Widgets.List: _SetFilterAction :: AsAction r_acqq key_a9Du itemWidget_a9Dv => Prism' r_acqq (WidgetSuperModel itemWidget_a9Dv -> Bool)
+ Glazier.React.Widgets.List: _SetFilterAction :: AsAction r_ahp7 key_agXR itemWidget_agXS => Prism' r_ahp7 (SuperModelOf itemWidget_agXS -> Bool)
- Glazier.React.Widgets.List: class AsAction r_acqq key_a9Du itemWidget_a9Dv | r_acqq -> key_a9Du itemWidget_a9Dv where _ComponentRefAction = (.) _Action _ComponentRefAction _RenderAction = (.) _Action _RenderAction _ComponentDidUpdateAction = (.) _Action _ComponentDidUpdateAction _DestroyItemAction = (.) _Action _DestroyItemAction _MakeItemAction = (.) _Action _MakeItemAction _AddItemAction = (.) _Action _AddItemAction _ItemAction = (.) _Action _ItemAction _SetFilterAction = (.) _Action _SetFilterAction
+ Glazier.React.Widgets.List: class AsAction r_ahp7 key_agXR itemWidget_agXS | r_ahp7 -> key_agXR itemWidget_agXS where _ComponentRefAction = (.) _Action _ComponentRefAction _RenderAction = (.) _Action _RenderAction _ComponentDidUpdateAction = (.) _Action _ComponentDidUpdateAction _DestroyItemAction = (.) _Action _DestroyItemAction _MakeItemAction = (.) _Action _MakeItemAction _AddItemAction = (.) _Action _AddItemAction _ItemAction = (.) _Action _ItemAction _SetFilterAction = (.) _Action _SetFilterAction
- Glazier.React.Widgets.List: class HasModel c_acPD key_a9vn itemWidget_a9vo | c_acPD -> key_a9vn itemWidget_a9vo where className = (.) model className componentRef = (.) model componentRef deferredCommands = (.) model deferredCommands frameNum = (.) model frameNum itemKey = (.) model itemKey itemsFilter = (.) model itemsFilter itemsModel = (.) model itemsModel uid = (.) model uid
+ Glazier.React.Widgets.List: class HasModel c_ahMw key_agXh itemWidget_agXi | c_ahMw -> key_agXh itemWidget_agXi where className = (.) model className componentRef = (.) model componentRef deferredCommands = (.) model deferredCommands frameNum = (.) model frameNum itemKey = (.) model itemKey itemsFilter = (.) model itemsFilter itemsModel = (.) model itemsModel uid = (.) model uid
- Glazier.React.Widgets.List: class HasPlan c_acLo where component = (.) plan component onComponentDidUpdate = (.) plan onComponentDidUpdate onComponentRef = (.) plan onComponentRef onRender = (.) plan onRender
+ Glazier.React.Widgets.List: class HasPlan c_ahIh where component = (.) plan component onComponentDidUpdate = (.) plan onComponentDidUpdate onComponentRef = (.) plan onComponentRef onRender = (.) plan onRender
- Glazier.React.Widgets.List: className :: HasModel c_acPD key_a9vn itemWidget_a9vo => Lens' c_acPD JSString
+ Glazier.React.Widgets.List: className :: HasModel c_ahMw key_agXh itemWidget_agXi => Lens' c_ahMw JSString
- Glazier.React.Widgets.List: component :: HasPlan c_acLo => Lens' c_acLo ReactComponent
+ Glazier.React.Widgets.List: component :: HasPlan c_ahIh => Lens' c_ahIh ReactComponent
- Glazier.React.Widgets.List: componentRef :: HasModel c_acPD key_a9vn itemWidget_a9vo => Lens' c_acPD JSVal
+ Glazier.React.Widgets.List: componentRef :: HasModel c_ahMw key_agXh itemWidget_agXi => Lens' c_ahMw JSVal
- Glazier.React.Widgets.List: deferredCommands :: HasModel c_acPD key_a9vn itemWidget_a9vo => Lens' c_acPD (DList (Command key_a9vn itemWidget_a9vo))
+ Glazier.React.Widgets.List: deferredCommands :: HasModel c_ahMw key_agXh itemWidget_agXi => Lens' c_ahMw (DList (Command key_agXh itemWidget_agXi))
- Glazier.React.Widgets.List: frameNum :: HasModel c_acPD key_a9vn itemWidget_a9vo => Lens' c_acPD Int
+ Glazier.React.Widgets.List: frameNum :: HasModel c_ahMw key_agXh itemWidget_agXi => Lens' c_ahMw Int
- Glazier.React.Widgets.List: gadget :: (Ord key, Monad m, Disposing (WidgetModel itemWidget), Disposing (WidgetPlan itemWidget)) => (WidgetModel itemWidget -> F (Maker (WidgetAction itemWidget)) (WidgetSuperModel itemWidget)) -> GadgetT (WidgetAction itemWidget) (WidgetSuperModel itemWidget) m (DList (WidgetCommand itemWidget)) -> GadgetT (Action key itemWidget) (SuperModel key itemWidget) m (DList (Command key itemWidget))
+ Glazier.React.Widgets.List: gadget :: (Ord key, Disposing (ModelOf itemWidget), Disposing (PlanOf itemWidget)) => (ModelOf itemWidget -> F (Maker (ActionOf itemWidget)) (SuperModelOf itemWidget)) -> GadgetT (ActionOf itemWidget) (SuperModelOf itemWidget) Identity (DList (CommandOf itemWidget)) -> GadgetT (Action key itemWidget) (SuperModel (Model key itemWidget) Plan) Identity (DList (Command key itemWidget))
- Glazier.React.Widgets.List: itemKey :: HasModel c_acPD key_a9vn itemWidget_a9vo => Lens' c_acPD key_a9vn
+ Glazier.React.Widgets.List: itemKey :: HasModel c_ahMw key_agXh itemWidget_agXi => Lens' c_ahMw key_agXh
- Glazier.React.Widgets.List: itemsFilter :: HasModel c_acPD key_a9vn itemWidget_a9vo => Lens' c_acPD (WidgetSuperModel itemWidget_a9vo -> Bool)
+ Glazier.React.Widgets.List: itemsFilter :: HasModel c_ahMw key_agXh itemWidget_agXi => Lens' c_ahMw (SuperModelOf itemWidget_agXi -> Bool)
- Glazier.React.Widgets.List: itemsModel :: HasModel c_acPD key_a9vn itemWidget_a9vo => Lens' c_acPD (Map key_a9vn (WidgetSuperModel itemWidget_a9vo))
+ Glazier.React.Widgets.List: itemsModel :: HasModel c_ahMw key_agXh itemWidget_agXi => Lens' c_ahMw (Map key_agXh (SuperModelOf itemWidget_agXi))
- Glazier.React.Widgets.List: mkPlan :: WindowT (WidgetDesign itemWidget) (ReactMlT Identity) () -> ReactMlT Identity () -> Replica key itemWidget -> F (Maker (Action key itemWidget)) Plan
+ Glazier.React.Widgets.List: mkPlan :: ReactMlT Identity () -> WindowT (DesignOf itemWidget) (ReactMlT Identity) () -> Frame (Model key itemWidget) Plan -> F (Maker (Action key itemWidget)) Plan
- Glazier.React.Widgets.List: model :: HasModel c_acPD key_a9vn itemWidget_a9vo => Lens' c_acPD (Model key_a9vn itemWidget_a9vo)
+ Glazier.React.Widgets.List: model :: HasModel c_ahMw key_agXh itemWidget_agXi => Lens' c_ahMw (Model key_agXh itemWidget_agXi)
- Glazier.React.Widgets.List: onComponentDidUpdate :: HasPlan c_acLo => Lens' c_acLo (Callback (JSVal -> IO ()))
+ Glazier.React.Widgets.List: onComponentDidUpdate :: HasPlan c_ahIh => Lens' c_ahIh (Callback (JSVal -> IO ()))
- Glazier.React.Widgets.List: onComponentRef :: HasPlan c_acLo => Lens' c_acLo (Callback (JSVal -> IO ()))
+ Glazier.React.Widgets.List: onComponentRef :: HasPlan c_ahIh => Lens' c_ahIh (Callback (JSVal -> IO ()))
- Glazier.React.Widgets.List: onRender :: HasPlan c_acLo => Lens' c_acLo (Callback (JSVal -> IO JSVal))
+ Glazier.React.Widgets.List: onRender :: HasPlan c_ahIh => Lens' c_ahIh (Callback (JSVal -> IO JSVal))
- Glazier.React.Widgets.List: plan :: HasPlan c_acLo => Lens' c_acLo Plan
+ Glazier.React.Widgets.List: plan :: HasPlan c_ahIh => Lens' c_ahIh Plan
- Glazier.React.Widgets.List: type Design key itemWidget = WidgetDesign (Widget key itemWidget)
+ Glazier.React.Widgets.List: type Design key itemWidget = Design (Model key itemWidget) Plan
- Glazier.React.Widgets.List: type SuperModel key itemWidget = WidgetSuperModel (Widget key itemWidget)
+ Glazier.React.Widgets.List: type SuperModel key itemWidget = SuperModel (Model key itemWidget) Plan
- Glazier.React.Widgets.List: uid :: HasModel c_acPD key_a9vn itemWidget_a9vo => Lens' c_acPD JSString
+ Glazier.React.Widgets.List: uid :: HasModel c_ahMw key_agXh itemWidget_agXi => Lens' c_ahMw JSString
- Glazier.React.Widgets.List: window :: Monad m => WindowT (Design key itemWidget) (ReactMlT m) ()
+ Glazier.React.Widgets.List: window :: WindowT (Design (Model key itemWidget) Plan) (ReactMlT Identity) ()
- Glazier.React.Widgets.List.Run: run :: (key -> WidgetCommand itemWidget -> IO ()) -> ReactComponent -> Output (Action key itemWidget) -> Command key itemWidget -> IO ()
+ Glazier.React.Widgets.List.Run: run :: (key -> CommandOf itemWidget -> IO ()) -> ReactComponent -> Output (Action key itemWidget) -> Command key itemWidget -> IO ()

Files

README.md view
@@ -1,3 +1,270 @@ [![Hackage](https://img.shields.io/hackage/v/glazier-react-widget.svg)](https://hackage.haskell.org/package/glazier-react-widget) -Composable Widget library using Glazier.React+This is a library of reusable composable widget using +[`Glazier.React`](https://github.com/louispan/glazier-react). Please help me to add more widgets to this library!++# Prerequisite reading++## Glazier+Please read the [README.md](https://github.com/louispan/glazier) for a brief overview of glazier.++## Glazier.React+Please read the [README.md](https://github.com/louispan/glazier-react) for a brief overview of glazier-react.++# Widget best practice++The following documents the expected conventions and best practices when defining a `Glazier.React.Widgets` widget.++## Exports+All widgets should export at the minimum the following:+```+module Glazier.React.Widgets.Input+    ( Command(..)+    , Action(..)+    , AsAction(..)+    , Plan(..)+    , HasPlan(..)+    , mkPlan+    , Model(..)+    , HasModel(..)+    , Design+    , Frame+    , SuperModel+    , Widget+    , widget+    , window+    , gadget+    ) where+```+This provides a consistent way to interact and use every widget.++Since all widgets export the same names, any widget should be imported qualified.++## Command+`Command`s are the result of the `Gadget` stateful processing of `Action`. It is a pure value that is interpreted effectfully.+```+data Command+    = RenderCommand (SuperModel Model Plan) [Property] JSVal+    | DisposeCommand SomeDisposable+    | MakerCommand (F (Maker Action) Action)+```+Some common commands are:++### RenderCommand+```+RenderCommand (SuperModel Model Plan) [Property] JSVal+```+This is send by `Gadget` when the re-rendering is required. It contains the`SuperModel` of the widget (to swap the latest `Design` into the `Frame`), the new React component state as a list of properties (usually just a sequence number), and the javascript reference to the javascript component.++### DisposeCommand+```+DisposeCommand SomeDisposable+```+This contains the list of callbacks to dispose after the next render frame (after [`componentDidUpdate`](https://facebook.github.io/react/docs/react-component.html#componentdidupdate) is called.++### MakerCommand+```+MakerCommand (F (Maker Action) Action)+```+This is the command to run the `Maker` instruction in the `Maker` interpreter which results in an `Action` to dispatch back tot he gadget.++## Action+This contains the events that the widget `Gadget` processes.+```+data Action+    = ComponentRefAction JSVal+    | RenderAction+    | ComponentDidUpdateAction+makeClassyPrisms ''Action+```+`Action`s should have [`makeClassyPrisms`](https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-TH.html#v:makeClassyPrisms) generated to facilitate embedding it in larger `Gadget` with [`magnify`](https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-Zoom.html#v:magnify).++Some common `Action`s are:+###  ComponentRefAction+```+ComponentRefAction JSVal+```+This action is generated by the [`ref`](https://facebook.github.io/react/docs/refs-and-the-dom.html) event listener and contains a javascript reference to the react component. This ref is used in the `RenderCommand`.++###  RenderAction+```+RenderAction+```+You can generate this action to force a widget to return the `RenderCommand` to force a re-render.++###  ComponentDidUpdateAction+```+ComponentDidUpdateAction JSVal+```++This action is generated by the [`componentDidUpdate`](https://facebook.github.io/react/docs/react-component.html#componentdidupdate) event listener. This event is usually used to generate the `DisposeCommand` to dispose callbacks from removed widgets.++## Model+This contains the pure data for state processing logic and rendering (the nouns).+```+data Model = Model+    { _uid :: J.JSString+    , _componentRef :: J.JSVal+    , _frameNum :: Int+    , _deferredCommands :: D.DList (Command key itemWidget)+    }+makeClassy ''Model+```+`Model`s should have [`makeClassy`](https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-TH.html#v:makeClassy) generated to facilitate embedding it in larger widget with [`magnify`](https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-Zoom.html#v:magnify) and [`zoom`](https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-Zoom.html#v:zoom).++Some common Model fields are+### uid+```+_uid :: JSString+```+`uid` is used to ensure a unique [key](https://facebook.github.io/react/docs/lists-and-keys.html) for React's efficient rendering of a list.++### componentRef+```+_componentRef :: JSVal+```+`componentRef` is used to store the reference to the instance of the React shim component from the `ComponentRefAction` and used in the `RenderCommand`++### frameNum+```+_frameNum :: Int+```+`frameNum` is the sequence number used in `RenderCommand`.++### _deferredCommands+```+_deferredCommands :: DList Command+```+`deferredCommands` keep the list of commands to run at the next `ComponentDidUpdateAction`. It usually contains `DisposeCommand`.++## Plan+The `Plan` contains the callbacks for integrating with React (the verbs). It also contains a javascript reference to the instance of shim component used for the widget. This reference is used to trigger rendering with  [`setState`](https://facebook.github.io/react/docs/react-component.html#setstate).++```+data Plan = Plan+    { _component :: R.ReactComponent+    , _onRender :: J.Callback (J.JSVal -> IO J.JSVal)+    , _onComponentRef :: J.Callback (J.JSVal -> IO ())+    , _onComponentDidUpdate :: J.Callback (J.JSVal -> IO ())   makeClassy ''Plan+```+`Plan`s should have [`makeClassy`](https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-TH.html#v:makeClassy) generated to allow consistent usage of lens to access `Model` and `Plan` fields.++Some common `Plan` fields are++### _component+```+_component :: ReactComponent+```+This contains the reference to the shim `React.PureComponent` class that is used to start the rendering.++### _onRender+```+_onRender :: Callback (JSVal -> IO JSVal)+```+The is the callback from the shim component's [`render`](https://facebook.github.io/react/docs/react-component.html#render) handler. It contains a javascript reference to the shim component's state, which is currently not used, but might be in the future.++### _onComponentRef+```+_onComponentRef :: Callback (JSVal -> IO ())+```+The is the callback from the shim component's [`ref`](https://facebook.github.io/react/docs/refs-and-the-dom.html) event listener. The callback is expected to generate the `ComponentRefAction`.++### _onComponentDidUpdate+```+_onComponentDidUpdate :: Callback (JSVal -> IO ())+```+The is the callback from the shim component's  [`componentDidUpdate`](https://facebook.github.io/react/docs/react-component.html#componentdidupdate) event listener.  The callback is expected to generate the `ComponentDidUpdateAction`.++## mkPlan+This is the missing piece required to construct a widget's `SuperModel`.+It contains the code to create a widget's `Plan` using the `Maker` DSL.++The `Applicative` typeclass makes this easy to define.+```+mkPlan :: Frame Model Plan -> F (Maker Action) Plan+mkPlan frm = Plan+    <$> getComponent+    <*> (mkRenderer frm $ const render)+    <*> (mkHandler $ pure . pure . InputRefAction)+    <*> (mkHandler $ pure . pure . ComponentRefAction)+    <*> (mkHandler $ pure . pure . const ComponentDidUpdateAction)+```++## Common code+All widgets should have implementation of the following++### Disposing Model and Plan+```+instance Disposing Plan+instance Disposing Model where+    disposing _ = DisposeNone+```++### Link HasPlan and HasModel+Link `Glazier.React.Model`'s genericHasPlan/HasModel with this widget's specific `HasPlan`/`HasModel` from generated from `makeClassy`++```+instance HasPlan (R.Design Model Plan) where+    plan = R.plan+instance HasModel (R.Design Model Plan) where+    model = R.model+instance HasPlan (R.SuperModel Model Plan) where+    plan = R.design . plan+instance HasModel (R.SuperModel Model Plan) where+    model = R.design . model+```++### Synonums to Design, Frame, and SuperModel+```+type Design = R.Design Model Plan+type Frame = R.Frame Model Plan+type SuperModel = R.SuperModel Model Plan+```++### Widget definitions+`widget` is a record of functions of the essential functions required to make, render and interact with the widget. By convention, `mkPlan`, `window`, and `gadget` is exported, but sometimes it's convenient to have all three grouped together in a record.+```+type Widget = Widget Command Action Model Plan+widget :: Widget Command Action Model Plan+widget = Widget+    mkPlan+    window+    gadget+```+`widget` is always an instance of `IsWidget` typeclass, so exporting a type synomym `Widget` will allow generic widget manipulation code.++For example, the [`List` widget](https://github.com/louispan/glazier-react-widget/blob/54a771f492b864ff422e31949284ea4b23aa02c6/src/Glazier/React/Widgets/List.hs#L128) uses the `IsWidget` typeclass of the item widgets in order to define the `widget` record value.++## window+This is the starting rendering function to start the rendering. It always only renders the shim React component with the specific callbacks:++```+window :: WindowT (Design Model Plan) (ReactMlT Identity) ()+window = do+    s <- ask+    lift $ lf (s ^. component . to toJS)+        [ ("key",  s ^. uid . to toJS)+        , ("render", s ^. onRender . to toJS)+        , ("ref", s ^. onComponentRef . to toJS)+        , ("componentDidUpdate", s ^. onComponentDidUpdate . to toJS)+        ]+```+This a a monad transformer stack over `Identity`. This ensures only pure effects are allowed.++## render+This is the inner rendering function. React will render the shim component from `window` above, and then call the `Plan`'s `onRender` callback of the shim component, which triggers this rendering function.++This contains the widget specific rendering instructions.+```+render :: WindowT (Design Model Plan) (ReactMlT Identity) ()+```+This a a monad transformer stack over `Identity`. This ensures only pure effects are allowed.++## gadget+This contains the state update logic:+```+gadget :: G.GadgetT Action (R.SuperModel Model Plan) Identity (DList Command)+```+This a a monad transformer stack over `Identity`. This ensures only pure effects are allowed.++When required, `STM`  can always be [`hoist (hoist generalize)`](https://github.com/louispan/glazier-react-examples/blob/32b5b077faa499e7501cb8e5417105b340de9ad3/examples/todo/haskell/app/Main.hs#L92) into the gadget using [`Control.Monad.Morph`](https://hackage.haskell.org/package/mmorph/docs/Control-Monad-Morph.html).
glazier-react-widget.cabal view
@@ -1,5 +1,5 @@ name:                glazier-react-widget-version:             0.2.0.0+version:             0.3.0.0 synopsis:            Generic widget library using glazier-react description:         Generic widget library using glazier-react homepage:            https://github.com/louispan/glazier-react-widget#readme@@ -25,7 +25,7 @@                      , dlist >= 0.8 && < 0.9                      , free >= 4.12 && < 5                      , glazier >= 0.10 && < 1-                     , glazier-react >= 0.2 && < 1+                     , glazier-react >= 0.3 && < 1                      , javascript-extras >= 0.2 && < 1                      , lens >= 4 && < 5                      , mmorph >= 1 && < 2
src/Glazier/React/Widgets/Input.hs view
@@ -17,11 +17,11 @@     , mkPlan     , Model(..)     , HasModel(..)-    , mkSuperModel-    , Widget     , Design-    , Replica+    , Frame     , SuperModel+    , Widget+    , widget     , window     , gadget     , whenKeyDown@@ -43,20 +43,17 @@ import qualified Glazier.React.Event as R import qualified Glazier.React.Maker as R import qualified Glazier.React.Markup as R+import qualified Glazier.React.Model as R import qualified Glazier.React.Widget as R import qualified JavaScript.Extras as JE -data Command act+data Command     = SetPropertyCommand JE.Property J.JSVal-    | GetPropertyCommand J.JSString J.JSVal (J.JSVal -> act)-    deriving Functor -data Action act-    = SendCommandsAction [Command act]+data Action+    = SendCommandsAction [Command]     | SubmitAction J.JSString     | InputRefAction J.JSVal-    | GetPropertyAction J.JSString (J.JSVal -> act)-    deriving Functor  data Model = Model     { _uid :: J.JSString@@ -76,40 +73,40 @@ makeClassy ''Plan makeClassy ''Model -mkPlan :: R.Replica Model Plan -> F (R.Maker (Action act)) Plan-mkPlan mm = Plan+mkPlan :: R.Frame Model Plan -> F (R.Maker Action) Plan+mkPlan frm = Plan     <$> R.getComponent-    <*> (R.mkRenderer mm $ const render)+    <*> (R.mkRenderer frm $ const render)     <*> (R.mkHandler $ pure . pure . InputRefAction)     <*> (R.mkHandler onKeyDown') +instance CD.Disposing Plan instance CD.Disposing Model where     disposing _ = CD.DisposeNone -mkSuperModel :: Model -> F (R.Maker (Action act)) (SuperModel act)-mkSuperModel mdl = R.mkSuperModel mkPlan (R.Design mdl)--data Widget act-instance R.IsWidget (Widget act) where-    type WidgetAction (Widget act) = Action act-    type WidgetCommand (Widget act) = Command act-    type WidgetModel (Widget act) = Model-    type WidgetPlan (Widget act) = Plan-type Design act = R.WidgetDesign (Widget act)-type Replica act = R.WidgetReplica (Widget act)-type SuperModel act = R.WidgetSuperModel (Widget act)-instance CD.Disposing Plan+-- Link Glazier.React.Model's HasPlan/HasModel with this widget's HasPlan/HasModel from makeClassy instance HasPlan (R.Design Model Plan) where-    plan = R.widgetPlan+    plan = R.plan instance HasModel (R.Design Model Plan) where-    model = R.widgetModel+    model = R.model instance HasPlan (R.SuperModel Model Plan) where     plan = R.design . plan instance HasModel (R.SuperModel Model Plan) where     model = R.design . model --- | This is used by parent components to render this component-window :: Monad m => G.WindowT (Design act) (R.ReactMlT m) ()+type Design = R.Design Model Plan+type Frame = R.Frame Model Plan+type SuperModel = R.SuperModel Model Plan++type Widget = R.Widget Command Action Model Plan+widget :: R.Widget Command Action Model Plan+widget = R.Widget+    mkPlan+    window+    gadget++-- | Exposed to parent components to render this component+window :: G.WindowT (R.Design Model Plan) (R.ReactMlT Identity) () window = do     s <- ask     lift $ R.lf (s ^. component . to JE.toJS)@@ -117,8 +114,8 @@         , ("render", s ^. onRender . to JE.toJS)         ] --- | This is used by the React render callback-render :: Monad m => G.WindowT (Design act) (R.ReactMlT m) ()+-- | Internal rendering used by the React render callback+render :: G.WindowT (R.Design Model Plan) (R.ReactMlT Identity) () render = do     s <- ask     lift $ R.lf (JE.strJS "input")@@ -139,17 +136,17 @@         let k = R.keyCode evt''         case k of             -- FIXME: ESCAPE_KEY-            27 -> pure $ (Nothing, input)+            27 -> pure (Nothing, input)             -- FIXME: ENTER_KEY             13 -> do                 v <- MaybeT $ JE.getProperty "value" input >>= JE.fromJS-                pure $ (Just v, input)+                pure (Just v, input)             _ -> empty -onKeyDown' :: J.JSVal -> MaybeT IO [Action act]+onKeyDown' :: J.JSVal -> MaybeT IO [Action] onKeyDown' = R.eventHandlerM whenKeyDown goLazy   where-    goLazy :: (Maybe J.JSString, J.JSVal) -> MaybeT IO [Action act]+    goLazy :: (Maybe J.JSString, J.JSVal) -> MaybeT IO [Action]     goLazy (ms, j) = pure $         SendCommandsAction [SetPropertyCommand ("value", JE.toJS J.empty) j]         : maybe [] (pure . SubmitAction) ms@@ -158,7 +155,7 @@ -- The best practice is to leave this in general Monad m (eg, not MonadIO). -- This allows gadget to use STM as the base monad which allows for combining concurrently -- with other stateful STM effects and still maintain a single source of truth.-gadget :: Monad m => G.GadgetT (Action act) (SuperModel act) m (D.DList (Command act))+gadget :: G.GadgetT Action (R.SuperModel Model Plan) Identity (D.DList Command) gadget = do     a <- ask     case a of@@ -170,7 +167,3 @@         InputRefAction v -> do             inputRef .= v             pure mempty--        GetPropertyAction prop f -> do-            j <- use inputRef-            pure $ D.singleton $ GetPropertyCommand prop j f
src/Glazier/React/Widgets/Input/Run.hs view
@@ -2,16 +2,9 @@     ( run     ) where -import Control.Concurrent.STM-import Control.Monad import qualified JavaScript.Extras as JE-import qualified Pipes.Concurrent as PC import Glazier.React.Widgets.Input -run :: PC.Output act -> Command act -> IO ()--run _ (SetPropertyCommand prop j) = JE.setProperty prop j+run :: Command -> IO () -run output (GetPropertyCommand prop j f) = do-    v <- JE.getProperty prop j-    void $ atomically $ PC.send output (f v)+run (SetPropertyCommand prop j) = JE.setProperty prop j
src/Glazier/React/Widgets/List.hs view
@@ -19,11 +19,11 @@     , mkPlan     , Model(..)     , HasModel(..)-    , mkSuperModel-    , Widget     , Design-    , Replica+    , Frame     , SuperModel+    , Widget+    , widget     , window     , gadget     ) where@@ -47,6 +47,7 @@ import qualified Glazier.React.Component as R import qualified Glazier.React.Maker as R import qualified Glazier.React.Markup as R+import qualified Glazier.React.Model as R import qualified Glazier.React.Widget as R import qualified JavaScript.Extras as JE @@ -54,17 +55,17 @@     = RenderCommand (R.SuperModel (Model key itemWidget) Plan) [JE.Property] J.JSVal     | DisposeCommand CD.SomeDisposable     | MakerCommand (F (R.Maker (Action key itemWidget)) (Action key itemWidget))-    | ItemCommand key (R.WidgetCommand itemWidget)+    | ItemCommand key (R.CommandOf itemWidget)  data Action key itemWidget     = ComponentRefAction J.JSVal     | RenderAction     | ComponentDidUpdateAction     | DestroyItemAction key-    | MakeItemAction (key -> key) (key -> F (R.Maker (R.WidgetAction itemWidget)) (R.WidgetModel itemWidget))-    | AddItemAction key (R.WidgetSuperModel itemWidget)-    | ItemAction key (R.WidgetAction itemWidget)-    | SetFilterAction (R.WidgetSuperModel itemWidget -> Bool)+    | MakeItemAction (key -> key) (key -> F (R.Maker (R.ActionOf itemWidget)) (R.ModelOf itemWidget))+    | AddItemAction key (R.SuperModelOf itemWidget)+    | ItemAction key (R.ActionOf itemWidget)+    | SetFilterAction (R.SuperModelOf itemWidget -> Bool)  data Model key itemWidget = Model     { _uid :: J.JSString@@ -73,8 +74,8 @@     , _deferredCommands :: D.DList (Command key itemWidget)     , _className ::J.JSString     , _itemKey :: key-    , _itemsModel :: M.Map key (R.WidgetSuperModel itemWidget)-    , _itemsFilter :: R.WidgetSuperModel itemWidget -> Bool+    , _itemsModel :: M.Map key (R.SuperModelOf itemWidget)+    , _itemsFilter :: R.SuperModelOf itemWidget -> Bool     }  data Plan = Plan@@ -89,51 +90,48 @@ makeClassy ''Model  mkPlan-    :: G.WindowT (R.WidgetDesign itemWidget) (R.ReactMlT Identity) ()-    -> R.ReactMlT Identity ()-    -> Replica key itemWidget+    :: R.ReactMlT Identity ()+    -> G.WindowT (R.DesignOf itemWidget) (R.ReactMlT Identity) ()+    -> R.Frame (Model key itemWidget) Plan     -> F (R.Maker (Action key itemWidget)) Plan-mkPlan itemWindow separator mm = Plan+mkPlan separator itemWindow frm = Plan     <$> R.getComponent-    <*> (R.mkRenderer mm $ const (render itemWindow separator))+    <*> (R.mkRenderer frm $ const (render separator itemWindow))     <*> (R.mkHandler $ pure . pure . ComponentRefAction)     <*> (R.mkHandler $ pure . pure . const ComponentDidUpdateAction) -instance ( CD.Disposing (R.WidgetPlan itemWidget)-         , CD.Disposing (R.WidgetModel itemWidget)-         ) =>+instance CD.Disposing Plan+instance (CD.Disposing (R.SuperModelOf itemWidget)) =>          CD.Disposing (Model key itemWidget) where-    disposing s =-        CD.DisposeList $ foldr ((:) . CD.disposing) [] (s ^. itemsModel)--mkSuperModel-    :: G.WindowT (R.WidgetDesign itemWidget) (R.ReactMlT Identity) ()-    -> R.ReactMlT Identity ()-    -> Model key itemWidget-    -> F (R.Maker (Action key itemWidget)) (SuperModel key itemWidget)-mkSuperModel itemWindow separator mdl = R.mkSuperModel (mkPlan itemWindow separator) (R.Design mdl)+    disposing s = CD.DisposeList $ foldr ((:) . CD.disposing) [] (_itemsModel s) -data Widget key itemWidget-instance R.IsWidget (Widget key itemWidget) where-    type WidgetAction (Widget key itemWidget) = Action key itemWidget-    type WidgetCommand (Widget key itemWidget) = Command key itemWidget-    type WidgetModel (Widget key itemWidget) = Model key itemWidget-    type WidgetPlan (Widget key itemWidget) = Plan-type Design key itemWidget = R.WidgetDesign (Widget key itemWidget)-type Replica key itemWidget = R.WidgetReplica (Widget key itemWidget)-type SuperModel key itemWidget = R.WidgetSuperModel (Widget key itemWidget)-instance CD.Disposing Plan+-- Link Glazier.React.Model's HasPlan/HasModel with this widget's HasPlan/HasModel from makeClassy instance HasPlan (R.Design (Model key itemWidget) Plan) where-    plan = R.widgetPlan+    plan = R.plan instance HasModel (R.Design (Model key itemWidget) Plan) key itemWidget where-    model = R.widgetModel+    model = R.model instance HasPlan (R.SuperModel (Model key itemWidget) Plan) where     plan = R.design . plan instance HasModel (R.SuperModel (Model key itemWidget) Plan) key itemWidget where     model = R.design . model --- | This is used by parent components to render this component-window :: Monad m => G.WindowT (Design key itemWidget) (R.ReactMlT m) ()+type Design key itemWidget = R.Design (Model key itemWidget) Plan+type Frame key itemWidget = R.Frame (Model key itemWidget) Plan+type SuperModel key itemWidget = R.SuperModel (Model key itemWidget) Plan++type Widget key itemWidget = R.Widget (Command key itemWidget) (Action key itemWidget) (Model key itemWidget) Plan+widget+    :: (R.IsWidget itemWidget, Ord key)+    => R.ReactMlT Identity ()+    -> itemWidget+    -> R.Widget (Command key itemWidget) (Action key itemWidget) (Model key itemWidget) Plan+widget separator itemWidget = R.Widget+    (mkPlan separator (R.window itemWidget))+    window+    (gadget (R.mkSuperModel itemWidget) (R.gadget itemWidget))++-- | Exposed to parent components to render this component+window :: G.WindowT (R.Design (Model key itemWidget) Plan) (R.ReactMlT Identity) () window = do     s <- ask     lift $ R.lf (s ^. component . to JE.toJS)@@ -143,13 +141,12 @@         , ("componentDidUpdate", s ^. onComponentDidUpdate . to JE.toJS)         ] --- | This is used by the React render callback+-- | Internal rendering used by the React render callback render-    :: Monad m-    => G.WindowT (R.WidgetDesign itemWidget) (R.ReactMlT m) ()-    -> R.ReactMlT m ()-    -> G.WindowT (Design key itemWidget) (R.ReactMlT m) ()-render itemWindow separator = do+    :: R.ReactMlT Identity ()+    -> G.WindowT (R.DesignOf itemWidget) (R.ReactMlT Identity) ()+    -> G.WindowT (R.Design (Model key itemWidget) Plan) (R.ReactMlT Identity) ()+render separator itemWindow = do     s <- ask     items <- fmap (view R.design) . filter (s ^. itemsFilter) . fmap snd .  M.toList <$> view itemsModel     lift $ R.bh (JE.strJS "ul") [ ("key", s ^. uid . to JE.toJS)@@ -160,10 +157,10 @@         sequenceA_ separatedWindows  gadget-    :: (Ord key, Monad m, CD.Disposing (R.WidgetModel itemWidget), CD.Disposing (R.WidgetPlan itemWidget))-    => (R.WidgetModel itemWidget -> F (R.Maker (R.WidgetAction itemWidget)) (R.WidgetSuperModel itemWidget))-    -> G.GadgetT (R.WidgetAction itemWidget) (R.WidgetSuperModel itemWidget) m (D.DList (R.WidgetCommand itemWidget))-    -> G.GadgetT (Action key itemWidget) (SuperModel key itemWidget) m (D.DList (Command key itemWidget))+    :: (Ord key, CD.Disposing (R.ModelOf itemWidget), CD.Disposing (R.PlanOf itemWidget))+    => (R.ModelOf itemWidget -> F (R.Maker (R.ActionOf itemWidget)) (R.SuperModelOf itemWidget))+    -> G.GadgetT (R.ActionOf itemWidget) (R.SuperModelOf itemWidget) Identity (D.DList (R.CommandOf itemWidget))+    -> G.GadgetT (Action key itemWidget) (R.SuperModel (Model key itemWidget) Plan) Identity (D.DList (Command key itemWidget)) gadget mkItemSuperModel itemGadget = do     a <- ask     case a of
src/Glazier/React/Widgets/List/Run.hs view
@@ -20,7 +20,7 @@ import qualified Pipes.Concurrent as PC  run-    :: (key -> R.WidgetCommand itemWidget -> IO ()) -- command runner for the items+    :: (key -> R.CommandOf itemWidget -> IO ()) -- command runner for the items     -> R.ReactComponent -- for Maker     -> PC.Output (Action key itemWidget)     -> Command key itemWidget