| | | 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 | | } |