[grapefruit] Sampling the record of signals

Wolfgang Jeltsch 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.

Hello Roman,

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 
record fields.

Now you can implement the sampling of all record fields:

        :: DSignal era ()
        -> TransformerPiece
                (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 :-) ).

Best wishes,

More information about the Grapefruit mailing list