Events/Finalizers/Streams

George Russell <[email protected]>
Newsgroups gmane.comp.lang.haskell.gui
Message-ID <[email protected]>
Nick wrote, quoting me, snipped

>>  For example, will this stream library also subsume CML style events
>>  (as implemented by me as part of HTk), which allow you to wait on
>>  multiple events and return when any one of them occurs? 
> 
> Well, this is an example wich requires concurrency. "Merge" of events
> will be available only on preemptive multithreaded implementation,
> unless I am wrong and there is an alternative way (like a "select"
> operator).

OK, with higher-order events, as invented by John Reppy (CML) and
implemented by me in Haskell, you do have a select operator, and you
do not need pre-emptive multithreading.  (Obviously such things are
a good thing anyway, but they are not essential.)  So if an

    Event a

is an event carrying a value of type "a", there is a function

    (+>) :: Event a -> Event a -> Event a

which selects either of the two events.  There is also another operator

    (>>>=) :: Event a -> (a -> IO b) -> Event b

allowing you to postprocess the result of an event in some way.

For example if you have two buttons, a "Yes" button with a click event
(yes :: Event ()), and a "No" button with a click event (no :: Event ())
then you can define construct

    yesOrNo :: Event Bool
    yesOrNo =
       (yes >>>= (\ _ -> return True)
    +> (no >>>= (\ _ -> return False)

Then

    sync yesOrNo

will wait for the next button click, and tell you if it was of "Yes" or
"No".
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.