{-# LANGUAGE ExistentialQuantification #-}
{-----------------------------------------------------------------------------
reactive-banana-wx
Utility functions for interfacing with wxHaskell
------------------------------------------------------------------------------}
module Reactive.Banana.WX where
import Reactive.Banana
import qualified Graphics.UI.WX as WX
{-----------------------------------------------------------------------------
Wx
Utilities for representing stuff from Wx as events and behaviors
------------------------------------------------------------------------------}
-- | Event with exactly one parameter.
event1 :: Typeable a => w -> WX.Event w (a -> IO ()) -> Prepare (Event a)
event1 widget e = fromAddHandler addHandler
where
addHandler k = WX.set widget [WX.on e WX.:~ \h x -> h x >> k x]
-- | Event without parameters.
event0 :: w -> WX.Event w (IO ()) -> Prepare (Event ())
event0 widget e = fromAddHandler addHandler
where
addHandler k = WX.set widget [WX.on e WX.:~ \h -> h >> k ()]
data Prop' w = forall a. (WX.Attr w a) :== (a, Event a)
-- | "Animate" a property with a stream of events
sink :: w -> [Prop' w] -> Prepare ()
sink widget props = mapM_ sink1 props
where
sink1 (attr :== (x,ex)) = do
liftIO $ WX.set widget [attr WX.:= x]
reactimate $ (\x -> WX.set widget [attr WX.:= x]) <$> ex