WriterPipe
WriterPipe.Create() aggregates writers into one.
IWriterToRef<int, int> writerX2 = DelegateWriter.Reader<int, int>(x => x * 2);
IWriterToRef<int, int> writerX3 = DelegateWriter.Reader<int, int>(x => x * 3);
IWriterToRef<int, int> writerX5 = DelegateWriter.Reader<int, int>(x => x * 5);
IWriterBase<int, int> pipe = WriterPipe.Create<int, int>(writerX2, writerX3, writerX5);
// "30"
WriteLine(pipe.Read(1));
Deconstructed piped to constructor creates a converter writer.
// Create deconstructor
RecordDeconstructorRequest myStructRequest = new RecordDeconstructorRequest(typeof(MyStruct));
IWriterToRef<MyStruct, ValueTuple<int>> myStructDeconstructor = AccessorServices.Instance.GetRequired<RecordDeconstructorRequest, IWriterToRef<MyStruct, ValueTuple<int>>>(myStructRequest);
// Create constructor
RecordConstructorRequest myClassRequest = new RecordConstructorRequest(typeof(MyClass));
IWriterToRef<ValueTuple<int>, MyClass> myClassConstructor = AccessorServices.Instance.GetRequired<RecordConstructorRequest, IWriterToRef<ValueTuple<int>, MyClass>>(myClassRequest);
// Pipe deconstructor -> constructor
IWriterBase<MyStruct, MyClass> pipe = WriterPipe.Create<MyStruct, MyClass>(myStructDeconstructor, myClassConstructor);
// Convert MyStruct to MyClass
MyClass myClass = pipe.Read(new MyStruct(99));
public record MyClass(int value);
public record struct MyStruct(int value);
WriterPipeRequest.Create(writers) is a request to create a pipe of writers.
// Deconstructor request
RecordConstructorRequest myClassConstructorRequest = new RecordConstructorRequest(typeof(MyClass));
// Constructor request
RecordDeconstructorRequest myStructDeconstructorRequest = new RecordDeconstructorRequest(typeof(MyStruct));
// Pipe deconstructor -> constructor request
WriterPipeRequest pipeRequest = WriterPipeRequest.Create(myStructDeconstructorRequest, myClassConstructorRequest);
// Request pipe
IWriterBase<MyStruct, MyClass> pipe = AccessorServices.Instance.GetRequired<WriterPipeRequest, IWriterBase<MyStruct, MyClass>>(pipeRequest);
// Convert MyStruct to MyClass
MyClass myClass = pipe.Read(new MyStruct(99));
Full Example
Full example
using System;
using Avalanche.Accessor;
using Avalanche.Service;
using Avalanche.Writer;
using static System.Console;
public class writerpipe
{
public static void Run()
{
{
// <01>
IWriterToRef<int, int> writerX2 = DelegateWriter.Reader<int, int>(x => x * 2);
IWriterToRef<int, int> writerX3 = DelegateWriter.Reader<int, int>(x => x * 3);
IWriterToRef<int, int> writerX5 = DelegateWriter.Reader<int, int>(x => x * 5);
IWriterBase<int, int> pipe = WriterPipe.Create<int, int>(writerX2, writerX3, writerX5);
// "30"
WriteLine(pipe.Read(1));
// </01>
}
{
// <11>
// Create deconstructor
RecordDeconstructorRequest myStructRequest = new RecordDeconstructorRequest(typeof(MyStruct));
IWriterToRef<MyStruct, ValueTuple<int>> myStructDeconstructor = AccessorServices.Instance.GetRequired<RecordDeconstructorRequest, IWriterToRef<MyStruct, ValueTuple<int>>>(myStructRequest);
// Create constructor
RecordConstructorRequest myClassRequest = new RecordConstructorRequest(typeof(MyClass));
IWriterToRef<ValueTuple<int>, MyClass> myClassConstructor = AccessorServices.Instance.GetRequired<RecordConstructorRequest, IWriterToRef<ValueTuple<int>, MyClass>>(myClassRequest);
// Pipe deconstructor -> constructor
IWriterBase<MyStruct, MyClass> pipe = WriterPipe.Create<MyStruct, MyClass>(myStructDeconstructor, myClassConstructor);
// Convert MyStruct to MyClass
MyClass myClass = pipe.Read(new MyStruct(99));
// </11>
}
{
// <21>
// Deconstructor request
RecordConstructorRequest myClassConstructorRequest = new RecordConstructorRequest(typeof(MyClass));
// Constructor request
RecordDeconstructorRequest myStructDeconstructorRequest = new RecordDeconstructorRequest(typeof(MyStruct));
// Pipe deconstructor -> constructor request
WriterPipeRequest pipeRequest = WriterPipeRequest.Create(myStructDeconstructorRequest, myClassConstructorRequest);
// Request pipe
IWriterBase<MyStruct, MyClass> pipe = AccessorServices.Instance.GetRequired<WriterPipeRequest, IWriterBase<MyStruct, MyClass>>(pipeRequest);
// Convert MyStruct to MyClass
MyClass myClass = pipe.Read(new MyStruct(99));
// </21>
}
}
// <12>
public record MyClass(int value);
public record struct MyStruct(int value);
// </12>
}