module Reactive.Banana.Threepenny (
event, behavior, sink,
module Reactive.Banana.Frameworks,
eventValue, behaviorValue, eventSelection,
) where
import Control.Monad (void)
import Reactive.Banana
import Reactive.Banana.Frameworks
import qualified Graphics.UI.Threepenny as UI
import Graphics.UI.Threepenny.Core hiding (Event)
event :: Frameworks t => (x -> UI.Event a) -> x -> Moment t (Event t a)
event e widget = fromAddHandler . register $ e widget
behavior :: Frameworks t => UI.ReadWriteAttr x i o -> x -> Moment t (Behavior t o)
behavior widget attr = fromPoll $ get widget attr
sink :: Frameworks t
=> UI.ReadWriteAttr x i o -> Behavior t i -> Moment t x -> Moment t ()
sink attr b mx = do
x <- mx
i <- initial b
liftIOLater $ void $ return x # set attr i
e <- changes b
reactimate $ (\i -> void $ return x # set attr i) <$> e
eventValue :: Frameworks t => UI.Element -> Moment t (Event t String)
eventValue = event $ \widget ->
UI.mapIO (const $ get value widget) (domEvent "keydown" widget)
behaviorValue :: Frameworks t => UI.Element -> String -> Moment t (Behavior t String)
behaviorValue w s = stepper s <$> eventValue w
eventSelection :: Frameworks t => UI.Element -> Moment t (Event t (Maybe Int))
eventSelection = event $ \widget ->
UI.mapIO (const $ get UI.selection widget) (UI.click widget)