Animas-0.1: Updated version of Yampa: a library for programming hybrid systems.

Portabilityportable
Stabilityprovisional
Maintainernilsson@cs.yale.edu

FRP.Animas.MergeableRecord

Description

Framework for record merging.

Idea:

MergeableRecord is intended to be a super class for classes providing update operations on records. The ADT induced by such a set of operations can be considered a mergeable record, which can be merged into larger mergeable records essentially by function composition. Finalization turns a mergeable record into a record.

Typical use:

Given

  data Foo = Foo {l1 :: T1, l2 :: T2}

one define a mergeable record type (MR Foo) by the following instance:

   instance MergeableRecord Foo where
       mrDefault = Foo {l1 = v1_dflt, l2 = v2_dflt}

Typically, one would also provide definitions for setting the fields, possibly (but not necessarily) overloaded:

   instance HasL1 Foo where
       setL1 v = mrMake (foo -> foo {l1 = v})

Now Foo records can be created as follows:

   let foo1 = setL1 v1
   ...
   let foo2 = setL2 v2 ~+~ foo1
   ...
   let fooN = setL1 vN ~+~ fooN-1
   let fooFinal = mrFinalize fooN

Synopsis

Documentation

class MergeableRecord a whereSource

Typeclass for mergeable records

Methods

mrDefault :: aSource

The default value of a record type

data MergeableRecord a => MR a Source

Type constructor for mergeable records.

mrMake :: MergeableRecord a => (a -> a) -> MR aSource

Construction of a mergeable record.

(~+~) :: MergeableRecord a => MR a -> MR a -> MR aSource

Merge two mergeable records. Left "overrides" in case of conflict.

mrMerge :: MergeableRecord a => MR a -> MR a -> MR aSource

Equivalent to '(~+~)' above.

mrFinalize :: MergeableRecord a => MR a -> aSource

Finalization: turn a mergeable record into a record.