reactive-banana

Library for functional reactive programming (FRP).

http://wiki.haskell.org/Reactive-banana

Version on this page:1.3.2.0@rev:3
LTS Haskell 23.0:1.3.2.0@rev:4
Stackage Nightly 2024-12-09:1.3.2.0@rev:4
Latest on Hackage:1.3.2.0@rev:4

See all snapshots reactive-banana appears in

BSD-3-Clause licensed by Heinrich Apfelmus
Maintained by Heinrich Apfelmus <apfelmus quantentunnel de>
This version can be pinned in stack with:reactive-banana-1.3.2.0@sha256:92d864e3fd4f0042426c4896b08127313ce466982393167811c0ffa664f2933f,5972

Reactive-banana is a library for Functional Reactive Programming (FRP).

FRP offers an elegant and concise way to express interactive programs such as graphical user interfaces, animations, computer music or robot controllers. It promises to avoid the spaghetti code that is all too common in traditional approaches to GUI programming.

See the project homepage http://wiki.haskell.org/Reactive-banana for more detailed documentation and examples.

Stability forecast. This is a stable library, though minor API changes are still likely. It features an efficient, push-driven implementation and has seen some optimization work.

API guide. Start with the Reactive.Banana module.

Changes

Changelog for the reactive-banana package

Version 1.3.2.0 (2023-01-22)

  • Fixed multiple space leaks for dynamic event switching by completely redesigning low-level internals. Added automated tests on garbage collection and space leaks in order to make sure that the leaks stay fixed. #261, #267, #268

Version 1.3.1.0 (2022-08-11)

  • Various internal performance improvements. #257, #258
  • Fix a space leak in dynamic event switching. #256
  • Reduce memory usage of stepper/accumB. #260
  • Prevent a deadlock if the network crashes when evaluating a Behavior or Event. #262

Version 1.3.0.0 (2022-03-28)

  • Added Semigroup and Monoid instances to Moment and MomentIO. #223
  • Add @> operator. #229
  • switchE now takes an initial event. This is breaking change. The previous behavior can be restored by using switchE never. #165
  • Triggering an AddHandler no longer allocates, leading to a minor performance improvement. #237
  • A new once combinator has been added that filters an Event so it only fires once. #239
  • MonadMoment instances have been added for all possibly monad transformers (from the transformers library). #248
  • Some internal refactoring to reduce allocations and improve performance. #238
  • The Reactive.Banana.Prim hierarchy has been changed to better reflect the abstraction hierarchy. #241

Version 1.2.2.0

  • Optimize the implementation of Graph.listParents #209
  • Replace a use of foldl with foldl'. #212
  • Simplify the internal mkWeakIORef function. #154
  • Add merge and mergeWith combinators. #163, #220
  • Make internal SCC pragmas compatible with the GHC 9.0 parser. #208
  • Change insertWith (flip (++)) to insertWith (++) in insertEdge. #211
  • Add Semigroup a => Semigroup (Behavior a) and Monoid a => Monoid (Behavior a) instances. #185
  • Loosen the upper-bound for hashable and semigroups. #205

version 1.2.1.0

  • Add Num, Floating, Fractional, and IsString instances for Behavior. #34
  • Support containers-0.6. #191

version 1.2.0.0

  • Make MonadFix superclass of MonadMoment. #128
  • Add Semigroup and Monoid instances for Event. #104
  • Semigroup compatibility with GHC 8.4.1 #168
  • Increased upper-bound on pqueue.

version 1.1.0.1

  • Adapt library to work with GHC-8.0.1.

version 1.1.0.0

  • Fix bug: Types of switchB and switchE need to be in the Moment monad.
  • Clean up and simplify model implementation in the Reactive.Banana.Model module.
  • Update type signatures of the interpret* functions to make it easier to try FRP functions in the REPL.
  • Remove showNetwork function.

version 1.0.0.1

  • Improve documentation.
    • Add prose section on recursion.
    • Improve explanation for the changes function.
  • Bump transfomers dependency.
  • Remove defunct UseExtensions flag from cabal file.

version 1.0.0.0

The API has been redesigned significantly in this version!

  • Remove phantom type parameter t from Event, Behavior and Moment types.
    • Change accumulation functions (accumB, accumE, stepper) to have a monadic result type.
    • Merge module Reactive.Banana.Switch into module Reactive.Banana.Combinators.
    • Simplify types of the switching functions (switchE, switchB, observeB, execute).
    • Remove functions trimE and trimB.
    • Remove types AnyMoment and Identity.
  • Remove Frameworks class constraint, use MomentIO type instead.
    • Add class MonadMoment for both polymorphism over the Moment and MomentIO types.
  • Change type Event to only allow a single event per moment in time.
    • Remove function union. Use unionWith instead.
    • Change function unions to only merge events of type Event (a -> a).
  • Remove module Reactive.Banana.Experimental.Calm.
  • Change the model implementation in the module Reactive.Banana.Model to the new API as well.

Other changes:

  • Add mapEventIO utility function to build an Event that contains the result of an IO computation.
  • Add newBehavior utility function to build a Behavior that can be updated with a Handler.
  • Add illustrations to the API documentation.

version 0.9.0.0

  • Implement garbage collection for dynamically switched events.
  • Fix issue #79 where recursive declarations would sometimes result in dropped events.
  • Limit value recursion in the Moment monad slightly.
  • Change initial and valueB to behave subtly different when it comes to value recursion in the Moment monad.
  • Add Functor, Applicative and Monad instances for the FrameworksMoment type.
  • Depend on the pqueue package instead of the psqueues package again, as the former has been updated to work with the current version of GHC.

version 0.8.1.2

  • Depend on the psqueues package instead of the pqueue package for the priority queue.

version 0.8.1.1

  • Links to the Haskell wiki now point to the http://wiki.haskell.org subdomain.

version 0.8.1.0

  • Module Reactive.Banana.Switch now adheres to the “Functor Applicative Monad Proposal” proposal]amp-proposal.

version 0.8.0.4

  • Just a re-upload. The previous archive was broken.

version 0.8.0.3

  • Export the Future type.
  • Restrict containers dependency to lower bound 0.5.

version 0.8.0.2

  • Fix compilation issue with hiding empty from the module Reactive.Banana.Prim.Order.

version 0.8.0.1

  • New examples Counter.hs and Octave.hs.
  • Bump transfomers dependency.

version 0.8.0.0

  • A new module Reactive.Banana.Prim exports primitive combinators that you can use to implement your own FRP library with a different API.
  • The push-driven implementation in Reactive.Banana.Prim now has the performance characteristics of an actual push-driven implementation. Some work has gone into optimizing constant factors as well. However there is still no garbage collection for dynamically created events and behaviors.
  • The accumE and accumB combinators evaluate their state to WHNF to avoid a space leak. (Fixes issue #52). On the other hand, Behavior values are evaluated on demanded, i.e. only when required by the apply combinator <@> or similar.
  • Recursion between events and behaviors should now work as advertised. (Fixed issue #56).
  • The deprecated liftIONow function has been removed.
  • The type of the changes function now indicates that the new Behavior value is only available in the context of reactimate. A variant reactimate' makes this explicit.
  • The module Control.Event.Handler now exports the AddHandler type, which is now a newtype. The module Reactive.Banana.Frameworks.AddHandler has been removed.

version 0.7.1.0

  • Deprecate the liftIONow function in favor of liftIO.

version 0.7.0.0

  • Dynamic event switching. Combinators are now available in the module Reactive.Banana.Switch.
  • Rename NetworkDescription to Moment, add class constraint Frameworks t.
  • No longer compiles with the JavaScript backend of the Utrecht Haskell compiler.
  • Change the changes combinator to be less useful.

version 0.6.0.0

  • Can now be compiled with the JavaScript backend of the Utrecht Haskell compiler.
  • The push-driven implementations needs the UseExtensions flag to work. This flag is enabled by default.
  • Minor module reorganization.

version 0.5.0.0announcement

This update includes numerous changes, in particular a complete overhaul of the internal implementation. Here a partial list.

  • Add collect, spill and unionWith combinators to deal with simultaneous events.
  • Remove general Monoid instance for Event to simplify reasoning about simultaneous events.
  • Add initial and changes combinators that allow you to observe updates to Behavior. Remove the Reactive.Banana.Incremental module.
  • Rename most modules,
  • Change type signatures: The main types Event, Behavior and NetworkDescription now carry an additional phantom type.

version 0.4.3.1

  • Model implementation of accumE now has the intended semantics.

version 0.4.3.0

  • Change semantics: IO actions from inside reactimate may now interleave as dictated by your event-based framework (issue #15).
  • Fix bug: compiling a network twice no longer fails due to lingering global state (issue #16).
  • Change type: remove Typeable constraint from interpret and interpretAsHandler.
  • Misc: Remove the BlackBoard application from the repository.

version 0.4.2.0

  • Change type: remove Typeable constraint from fromAddHandler.
  • Misc: the Vault data type gets its own package.
  • Misc: reactive-banana-wx now compiles properly with cabal.
  • Add some more examples to the reactive-banana-wx package.

version 0.4.1.0

  • Add <@> operator for more convenience when using apply.
  • Add support for value recursion to the NetworkDescription monad.
  • Add many examples to reactive-banana-wx.

version 0.4.0.0announcement

  • Add function fromPoll to obtain behaviors from mutable data.
  • Change name: run is now called actuate.
  • Add derived data type Discrete.
  • Add function interpretAsHandler.

version 0.3.0.0announcement

  • change: event networks are now first-class values, you can pause or run them.
  • change type: AddHandler now expects a way to unregister event handlers.
  • add example RunPause.hs

version 0.2.0.0announcement

  • change: now implements proper semantics as pioneered by Conal Elliott
  • model implementation for semantics
  • push-driven implementation for efficiency
  • add example SlotMachine.hs

version 0.1.0.0

  • initial release