| | 1 | | using System.ComponentModel; |
| | 2 | | using System.Diagnostics.CodeAnalysis; |
| | 3 | | using System.Threading.Channels; |
| | 4 | |
|
| | 5 | | using JetBrains.Annotations; |
| | 6 | |
|
| | 7 | | namespace mkmrk.Channels; |
| | 8 | |
|
| | 9 | | /// <inheritdoc cref="IBroadcastChannelReaderSource{TData,TResponse}"/> |
| | 10 | | // [EditorBrowsable(EditorBrowsableState.Never)] |
| | 11 | | public class BroadcastChannelReaderSource<TData, TResponse> |
| | 12 | | : IBroadcastChannelReaderSource<TData, TResponse> |
| | 13 | | where TResponse : IBroadcastChannelResponse { |
| | 14 | |
|
| | 15 | | // KILL |
| | 16 | | // /// <summary> |
| | 17 | | // /// Reader saved for use when this is being used as an implicit conversion to a reader. |
| | 18 | | // /// </summary> |
| | 19 | | // [ SuppressMessage( "Design", "CA1051:Do not declare visible instance fields" ) ] |
| | 20 | | // protected IBroadcastChannelReader<TData, TResponse>? _reader = null; |
| | 21 | | private readonly IBroadcastChannelWriter<TData, TResponse> _broadcastChannel; |
| | 22 | |
|
| | 23 | | /// <inheritdoc cref="BroadcastChannelReaderSource{TData,TResponse}" /> |
| | 24 | | // Ideally, only internal code would be able to construct, but a public constructor is needed for dependency injecti |
| | 25 | | [ EditorBrowsable( EditorBrowsableState.Never ) ] |
| 2 | 26 | | public BroadcastChannelReaderSource( IBroadcastChannelWriter<TData, TResponse> broadcastChannel ) |
| 2 | 27 | | => _broadcastChannel = broadcastChannel; |
| | 28 | |
|
| | 29 | | /// <inheritdoc cref="BroadcastChannel{TData,TResponse}.CreateReader" /> |
| | 30 | | /// <remarks> |
| | 31 | | /// The reader returned will always be the same. |
| | 32 | | /// Only one reader can be allocated from a single <see cref="BroadcastChannelReaderSource{TData,TResponse}"/>. |
| | 33 | | /// </remarks> |
| | 34 | | [ PublicAPI ] |
| 2 | 35 | | public IBroadcastChannelReader<TData, TResponse> CreateReader( ) => _broadcastChannel.CreateReader(); |
| | 36 | |
|
| | 37 | | // // TODO: FUTURE? GetResponseChannel doesn't exist yet. |
| | 38 | | // public ChannelWriter<TResponse> GetResponseChannel( ) => _responseChannel ??= _broadcastChannel.GetResponseChanne |
| | 39 | |
|
| | 40 | | /// <inheritdoc /> |
| | 41 | | [ SuppressMessage( "Design", "CA1033:Interface methods should be callable by child types", Justification = "Only bei |
| 2 | 42 | | RemoveWriterByHashCode IBroadcastChannelAddReaderProvider<TData>.AddReader( ChannelWriter<TData> reader ) => _broadc |
| | 43 | |
|
| | 44 | | /// <inheritdoc /> |
| 0 | 45 | | IBroadcastChannelReader<TData> IBroadcastChannelReaderSource<TData>.CreateReader( ) => this.CreateReader(); |
| | 46 | |
|
| | 47 | | // KILL |
| | 48 | | // /// <summary> |
| | 49 | | // /// Enables easy use as <see cref="BroadcastChannelReader{TData,TResponse}"/> |
| | 50 | | // /// </summary> |
| | 51 | | // [ SuppressMessage( "Usage", "CA2225:Operator overloads have named alternates" ) ] |
| | 52 | | // public static implicit operator BroadcastChannelReader<TData, TResponse>( BroadcastChannelReaderSource<TData, TRe |
| | 53 | | // ArgumentNullException.ThrowIfNull( src ); |
| | 54 | | // return ( src._reader ??= src.CreateReader() ) as BroadcastChannelReader<TData, TResponse> ?? ThrowHelper.Thro |
| | 55 | | // } |
| | 56 | | } |
| | 57 | |
|
| | 58 | | /// <inheritdoc cref="IBroadcastChannelReaderSource{TData}"/> |
| | 59 | | [ EditorBrowsable( EditorBrowsableState.Never ) ] // not meant for end user consumption, but the constructor must be acc |
| | 60 | | public class BroadcastChannelReaderSource<TData> |
| | 61 | | : BroadcastChannelReaderSource<TData, IBroadcastChannelResponse>, IBroadcastChannelReaderSource<TData> { |
| | 62 | | /// <inheritdoc /> |
| | 63 | | public BroadcastChannelReaderSource( IBroadcastChannelWriter<TData> broadcastChannelWriter ) : |
| | 64 | | base( broadcastChannelWriter as IBroadcastChannelWriter<TData, IBroadcastChannelResponse> |
| | 65 | | ?? ThrowHelper.ThrowInvalidCastException<IBroadcastChannelWriter<TData>, IBroadcastChannelWriter<TData, IB |
| | 66 | |
|
| | 67 | |
|
| | 68 | | /// <inheritdoc /> |
| | 69 | | IBroadcastChannelReader<TData> IBroadcastChannelReaderSource<TData>.CreateReader( ) => this.CreateReader(); |
| | 70 | |
|
| | 71 | | // KILL |
| | 72 | | // /// <summary> |
| | 73 | | // /// Enables easy use as <see cref="BroadcastChannelReader{TData,TResponse}"/> |
| | 74 | | // /// </summary> |
| | 75 | | // [ SuppressMessage( "Usage", "CA2225:Operator overloads have named alternates" ) ] |
| | 76 | | // public static implicit operator BroadcastChannelReader<TData>( BroadcastChannelReaderSource<TData> src ) { |
| | 77 | | // ArgumentNullException.ThrowIfNull( src ); |
| | 78 | | // return ( src._reader ??= src.CreateReader() ) as BroadcastChannelReader<TData> ?? ThrowHelper.ThrowInvalidCas |
| | 79 | | // } |
| | 80 | | } |