{-# LANGUAGE ExistentialQuantification #-}
{-----------------------------------------------------------------------------
    reactive-banan-wx
    
    Utility functions for interfacing with wxHaskell
------------------------------------------------------------------------------}

module Reactive.WX where

import Reactive.Core
import qualified Graphics.UI.WX as WX

{-----------------------------------------------------------------------------
    Wx
    
    Utilities for representing stuff from Wx as events and behaviors
------------------------------------------------------------------------------}

-- | Event with exactly one parameter.
event1 :: w -> WX.Event w (a -> IO ()) -> Event a
event1 widget e = fromEventSource $ EventSource
    { getEventHandler = WX.get widget (WX.on e)
    , setEventHandler = \h -> WX.set widget [WX.on e WX.:= h] }

-- | Event without parameters.
event0 :: w -> WX.Event w (IO ()) -> Event ()
event0 widget e = fromEventSource $ EventSource
    { getEventHandler = (\m -> \() -> m) `fmap` WX.get widget (WX.on e)
    , setEventHandler = \h -> WX.set widget [WX.on e WX.:= h ()] }

data Prop' w = forall a. (WX.Attr w a) :== Behavior a

-- | "Animate" a property with a behavior
sink :: w -> [Prop' w] -> Prepare ()
sink widget props = mapM_ sink1 props
    where
    sink1 (attr :== b) = do
        WX.set widget [attr  WX.:=  initial b]
        reactimate $ (\a -> WX.set widget [attr WX.:= a]) `fmap` changes b