
Hi Cafe, I am trying to write a very simple implementation of an event publisher pattern but I am stuck and do not know how to do this in Haskell. I have the following code: ======================== {-# LANGUAGE RankNTypes, NamedFieldPuns #-} module Domain.DomainEventPublisher where import Control.Monad (forM_) import HsFu.Data.DateTime import Domain.Client data DomainEvent = ClientChangeAgeDomainEvent data DomainEventContext = DomainEventContext { domainEventContext_event :: DomainEvent , domainEventContext_occurredOn :: DateTime } deriving (Show) data DomainEventPublisher = DomainEventPublisher { domainEventPublisher_subscribers :: [DomainEventContext -> IO ()] } mkEventPublisher :: DomainEventPublisher mkEventPublisher = DomainEventPublisher [] subscribe :: DomainEventPublisher -> (DomainEventContext -> IO ()) -> DomainEventPublisher subscribe publisher eventHandler = DomainEventPublisher { domainEventPublisher_subscribers = eventHandler : (domainEventPublisher_subscribers publisher) } publish :: DomainEventPublisher -> DomainEventContext -> IO () publish DomainEventPublisher{ domainEventPublisher_subscribers } event = forM_ domainEventPublisher_subscribers ($ event) ======================== My problem is that the publish method returns IO (), which means that events can only be published from the IO monad, but I would like events to be 'publish-able' from pure code. I can live with event handlers (passed into the subscribe function) being in the IO monad. Is there a better way to implement this pattern in Haskell? I have been racking my brain on this for a while now and cannot seem to come up with a good implementation. Regards --Rouan.