[Haskell-cafe] Observer pattern in Haskell?

Andy Gimblett haskell at gimbo.org.uk
Mon Nov 9 09:23:42 EST 2009


Hi all,

I've been doing some GUI programming recently, using wx.  To help  
manage dependencies between state and UI elements, I looked for a  
Haskell version of the Observer design pattern, and I found an  
implementation written by Bastiaan Heeren of ou.nl [1].

It pretty much did what I wanted, though I made a few changes along  
the way.  Since this seems to be of general use (ie beyond wx), I've  
proposed to Bastiaan that I package it up for release on hackage, and  
he's happy for me to do so.  Before I do so, I thought I'd ask for  
comments.

The code is on github: http://github.com/gimbo/observer.hs where we  
have:

     Control.Observer - a typeclass for observable objects.
     Control.Observer.Synchronous - an implementation based on IORefs.

This is essentially the same as Bastiaan's original, except I've  
changed the names, split it into two modules, commented it, added one  
or two small things, and Cabalised it.

I've also made a branch where Control.Observer.Synchronous uses MVars  
instead of IORefs, in an attempt to achieve thread safety:

http://github.com/gimbo/observer.hs/blob/threadsafeSync/Control/Observer/Synchronous.hs

Now, before I make a hackage release:

0. Is this completely insane, in a Haskell setting?  Are there better  
ways to do this that aren't laden with OO-worldview baggage?

1. Does anyone have any comments, on either version?

2. In particular, is the MVar version sensible?  I'm aiming for mutual  
exclusion between threads.  I _think_ I've got it, but I'm perhaps not  
familiar enough with the semantics of MVar to be certain.  Advice  
appreciated.  If it _is_ sensible, then is there any reason not to  
just use this, and discard the IORef version?

The current implementation is synchronous, in that any observer  
functions are called immediately and synchronously (and in the same  
thread as the change of subject value).  I'm pondering extending the  
package with an asynchronous version where the update just trips a  
flag, and the observer function picks this up later - possibly in  
another thread.  The idea there is to help in cases where certain  
operations have to be in a particular thread.  But this will mean a  
change to the typeclass too, I guess - or the addition of another one  
for observers themselves.  Again, any thoughts?

Thanks!

-Andy

[1] http://www.cs.uu.nl/wiki/bin/view/Afp0607/ExerciseWXHaskell



More information about the Haskell-Cafe mailing list