[grapefruit] Sampling the record of signals
g9ks157k at acme.softbase.org
Thu Apr 23 12:18:33 EDT 2009
Am Mittwoch, 22. April 2009 17:59 schrieb Roman Cheplyaka:
> Can someone show me how to use map on records?
> Precisely, I have a record of CSignals and want to sample them (with the
> same sampler) and to get record of SSignals.
Data.Record.map uses the same record type for the source and destination
record. The only thing that can differ is the style.
If you use signal style records, your source record type will look like this:
X :& CSignal `Of` val_1 :& … :& CSignal `Of` val_n
However, your destination record type will look like this:
X :& SSignal `Of` val_1 :& … :& SSignal `Of` val_n
So both differ.
The solution would be to remove the concrete signal type (CSignal or SSignal)
from the record type and put it into the style instead. This is the same as
what’s already done with signal, producer and consumer records. Their record
types only contain sort types of the form signal `Of` val. It’s the concrete
style that transforms this into signal era val, Consumer signal val or
Producer signal val.
So what you should do is using record types like this:
X :& val_1 :& … :& val_n
Then define a new “homegenous signal style” like this:
data HomSignalStyle (signal :: * -> * -> *) era
instance Style (HomSignalStyle signal era) where
type K (HomSignalStyle signal era) = PlainKind
type instance Value (HomSignalStyle signal era) val = signal era val
Homegenous signal records are now defined to be signal records where not only
the era but also the signal type (CSignal, SSignal, …) is the same for all
Now you can implement the sampling of all record fields:
:: DSignal era ()
(HomSignalStyle CSignal era)
(HomSignalStyle SSignal era)
samplingTransformerPiece sampler = TransformerPiece $ (sampler #>)
sampleRecord :: (Record PlainKind record) =>
record (HomSignalStyle CSignal era) ->
record (HomSignalStyle SSignal era)
sampleRecord = Data.Record.map samplingTransformerPiece
Warning! All code in this e-mail is untested. :-(
Please ask if this is not yet clear (which would be understandable :-) ).
More information about the Grapefruit