this IProducer <TPrimary> primary, IProducer <TSecondary> secondary, Interpolator <TSecondary, TInterpolation> interpolator, DeliveryPolicy primaryDeliveryPolicy = null, DeliveryPolicy secondaryDeliveryPolicy = null) { return(Fuse(primary, secondary, interpolator, ValueTuple.Create, primaryDeliveryPolicy, secondaryDeliveryPolicy));
/// <summary> /// Interpolate a stream using a specified interpolator at a given sampling interval. /// </summary> /// <typeparam name="T">Type of source messages.</typeparam> /// <typeparam name="TInterpolation">Type of the interpolation result.</typeparam> /// <param name="source">Source stream.</param> /// <param name="samplingInterval">Interval at which to apply the interpolator.</param> /// <param name="interpolator">Interpolator to use for generating results.</param> /// <param name="alignmentDateTime">If non-null, this parameter specifies a time to align the sampling messages with. If the paramater /// is non-null, the messages will have originating times that align with (i.e., are an integral number of intervals away from) the /// specified alignment time.</param> /// <param name="deliveryPolicy">An optional delivery policy.</param> /// <returns>Output stream.</returns> public static IProducer <TInterpolation> Interpolate <T, TInterpolation>( this IProducer <T> source, TimeSpan samplingInterval, Interpolator <T, TInterpolation> interpolator, DateTime?alignmentDateTime = null, DeliveryPolicy deliveryPolicy = null) { var clock = Generators.Repeat(source.Out.Pipeline, 0, samplingInterval, alignmentDateTime); return(source.Interpolate(clock, interpolator, deliveryPolicy)); }
/// <summary> /// Interpolate a stream using a specified interpolator at interpolation points /// given by a clock stream. /// </summary> /// <typeparam name="T">Type of source messages.</typeparam> /// <typeparam name="TClock">Type of messages on the clock stream.</typeparam> /// <typeparam name="TInterpolation">Type of the interpolation result.</typeparam> /// <param name="source">Source stream.</param> /// <param name="clock">Clock stream that dictates the interpolation points.</param> /// <param name="interpolator">Interpolator to use for generating results.</param> /// <param name="sourceDeliveryPolicy">An optional delivery policy for the source stream.</param> /// <param name="clockDeliveryPolicy">An optional delivery policy for the clock stream.</param> /// <returns>Output stream.</returns> public static IProducer <TInterpolation> Interpolate <T, TClock, TInterpolation>( this IProducer <T> source, IProducer <TClock> clock, Interpolator <T, TInterpolation> interpolator, DeliveryPolicy sourceDeliveryPolicy = null, DeliveryPolicy clockDeliveryPolicy = null) { var fuse = new Fuse <TClock, T, TInterpolation, TInterpolation>(source.Out.Pipeline, interpolator, (clk, data) => data[0]); clock.PipeTo(fuse.InPrimary, clockDeliveryPolicy); source.PipeTo(fuse.InSecondaries[0], sourceDeliveryPolicy); return(fuse); }
/// <summary> /// Fuse with values from a secondary stream based on a specified interpolator. /// </summary> /// <typeparam name="TPrimary">Type of primary messages.</typeparam> /// <typeparam name="TSecondary">Type of secondary messages.</typeparam> /// <typeparam name="TInterpolation">Type of the interpolation result.</typeparam> /// <typeparam name="TOut">Type of output messages.</typeparam> /// <param name="primary">Primary stream.</param> /// <param name="secondary">Secondary stream.</param> /// <param name="interpolator">Interpolator to use when fusing the streams.</param> /// <param name="outputCreator">Function mapping the primary and secondary messages to an output message type.</param> /// <param name="primaryDeliveryPolicy">An optional delivery policy for the primary stream.</param> /// <param name="secondaryDeliveryPolicy">An optional delivery policy for the secondary stream(s).</param> /// <returns>Stream of fused values.</returns> public static IProducer <TOut> Fuse <TPrimary, TSecondary, TInterpolation, TOut>( this IProducer <TPrimary> primary, IProducer <TSecondary> secondary, Interpolator <TSecondary, TInterpolation> interpolator, Func <TPrimary, TInterpolation, TOut> outputCreator, DeliveryPolicy primaryDeliveryPolicy = null, DeliveryPolicy secondaryDeliveryPolicy = null) { return(Fuse( primary, new[] { secondary }, interpolator, (m, secondaryArray) => outputCreator(m, secondaryArray[0]), primaryDeliveryPolicy, secondaryDeliveryPolicy)); }
/// <summary> /// Interpolate a stream using a specified interpolator at a given sampling interval. /// </summary> /// <typeparam name="T">Type of source messages.</typeparam> /// <typeparam name="TInterpolation">Type of the interpolation result.</typeparam> /// <param name="source">Source stream.</param> /// <param name="samplingInterval">Interval at which to apply the interpolator.</param> /// <param name="interpolator">Interpolator to use for generating results.</param> /// <param name="alignmentDateTime">If non-null, this parameter specifies a time to align the sampling messages with. If the parameter /// is non-null, the messages will have originating times that align with (i.e., are an integral number of intervals away from) the /// specified alignment time.</param> /// <param name="deliveryPolicy">An optional delivery policy for the source stream.</param> /// <param name="name">An optional name for the stream operator.</param> /// <returns>Output stream.</returns> public static IProducer <TInterpolation> Interpolate <T, TInterpolation>( this IProducer <T> source, TimeSpan samplingInterval, Interpolator <T, TInterpolation> interpolator, DateTime?alignmentDateTime = null, DeliveryPolicy <T> deliveryPolicy = null, string name = null) { var clock = Generators.Repeat(source.Out.Pipeline, 0, samplingInterval, alignmentDateTime); return(source.Interpolate( clock, interpolator, deliveryPolicy, DeliveryPolicy.Unlimited, name ?? $"{nameof(Interpolate)}({interpolator})")); }