[Haskell-cafe] ANN: Buster 0.99.1, a library for application orchestration that is not FRP

Jeff Heard jefferson.r.heard at gmail.com
Thu Apr 2 12:33:36 EDT 2009

Alright, updated it to extract EData from the Event type and make it
separate.  Basically, now all type signatures

Event a
Widget a
Behaviour a

should read

Event [EData a]
Widget [EData a]
Behaviour [EData a]

for backward compatibility.

On Thu, Apr 2, 2009 at 11:53 AM, Jeff Heard <jefferson.r.heard at gmail.com> wrote:
> On Thu, Apr 2, 2009 at 11:22 AM, Jules Bean <jules at jellybean.co.uk> wrote:
>> Maybe I wasn't clear, and probably I'm being dense. I understand what you've
>> done - I looked at the type declarations before commenting - but I don't
>> understand why.
>> Why is it useful to be able to use basic types without locking down 'a'?
>> Why is it useful to have a value of type "Event FooBar" which, in apparent
>> defiance of the FooBar parameter, actually contains a value of type Double?
>> Jules
> I'm assuming everyone won't want to start from scratch in creating all
> their widgets and behaviours.  A bus contains only events of type 'a',
> therefore all widgets and behaviours on that bus must use events of
> type 'a'.  It is possible to run multiple buses at the same time in
> the same program, and even possible to have them communicate between
> each other (forkIO-ing the buses and attaching some arbitrary
> behaviour that takes events from bus0, translates their types and then
> puts them on bus1), and so that way you could use multiple types, but
> I don't see a problem with a user having to read the documentation and
> understand that an Event of type a contains data that is a variant
> including type a.  How is it useful?  Consider the following widgets:
> commandLineArgsWidget :: Widget a
> commandLineArgsWidget = getArgs >>=
>    \args -> produce' "Environment"
>                      "CommandLineArgsWidget"
>                      "argv"
>                      Persistent
>                      [EStringL args]
> environmentWidget :: Widget a
> environmentWidget b = getEnvironment >>=
>    mapM_ (\(k,v) -> produce' "Environment" "EnvironmentWidget" k
> Persistent [EString v] b)
> progNameWidget :: Widget a
> progNameWidget b = getProgName >>=
>    \v -> produce' "Environment" "ProgramNameWidget" "ProgramName"
> Persistent [EString v] b
> As the library stands right now, I can take these widgets and put them
> in a module and include them as part of the Buster library, and they
> can be used pretty arbitrarily.  I can see being more semantically
> pure and changing Event a to contain data of type a instead of data of
> type [EData a], in which case the type signatures would look like
> this:
> progNameWidget :: WIdget [EData a]
> and so forth to be compatible with Bus [EData a], but I think that in
> the end so many widgets will reuse the EData type that it's just as
> well to make it part of the Event rather than force the user to be
> explicit about it every time.  But if I'm generally disagreed with
> about this, I can change it -- I'm pretty neutral about it, to be
> honest.
> -- Jeff

More information about the Haskell-Cafe mailing list