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 ~+~ foo<N-1
let fooFinal = mrFinalize fooN
|