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));
Deconstructer piped to constructor creates a converter writer.
// Create deconstructor
DeconstructorRequest myStructRequest = new DeconstructorRequest(typeof(MyStruct));
IWriterToRef<MyStruct, ValueTuple<int>> myStructDeconstructor =
Services.Create(Avalanche.Accessor.Dto.Module.Instance)
.GetRequired<DeconstructorRequest, IWriterToRef<MyStruct, ValueTuple<int>>>(myStructRequest);
// Create constructor
ConstructorRequest myClassRequest = new ConstructorRequest(typeof(MyClass));
IWriterToRef<ValueTuple<int>, MyClass> myClassConstructor = Services.Create(Avalanche.Accessor.Dto.Module.Instance, CachePolicies.Default).GetRequired<ConstructorRequest, 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
ConstructorRequest myClassConstructorRequest = new ConstructorRequest(typeof(MyClass));
// Constructor request
DeconstructorRequest myStructDeconstructorRequest = new DeconstructorRequest(typeof(MyStruct));
// Pipe deconstructor -> constructor request
WriterPipeRequest pipeRequest = WriterPipeRequest.Create(myStructDeconstructorRequest, myClassConstructorRequest);
// Request pipe
IWriterBase<MyStruct, MyClass> pipe = Services.Create(Avalanche.Accessor.Dto.Module.Instance, CachePolicies.Default).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
DeconstructorRequest myStructRequest = new DeconstructorRequest(typeof(MyStruct));
IWriterToRef<MyStruct, ValueTuple<int>> myStructDeconstructor =
Services.Create(Avalanche.Accessor.Dto.Module.Instance)
.GetRequired<DeconstructorRequest, IWriterToRef<MyStruct, ValueTuple<int>>>(myStructRequest);
// Create constructor
ConstructorRequest myClassRequest = new ConstructorRequest(typeof(MyClass));
IWriterToRef<ValueTuple<int>, MyClass> myClassConstructor = Services.Create(Avalanche.Accessor.Dto.Module.Instance, CachePolicies.Default).GetRequired<ConstructorRequest, 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
ConstructorRequest myClassConstructorRequest = new ConstructorRequest(typeof(MyClass));
// Constructor request
DeconstructorRequest myStructDeconstructorRequest = new DeconstructorRequest(typeof(MyStruct));
// Pipe deconstructor -> constructor request
WriterPipeRequest pipeRequest = WriterPipeRequest.Create(myStructDeconstructorRequest, myClassConstructorRequest);
// Request pipe
IWriterBase<MyStruct, MyClass> pipe = Services.Create(Avalanche.Accessor.Dto.Module.Instance, CachePolicies.Default).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>
}