xref: /aosp_15_r20/external/grpc-grpc/src/objective-c/RxLibrary/GRXWriter.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker /*
2*cc02d7e2SAndroid Build Coastguard Worker  *
3*cc02d7e2SAndroid Build Coastguard Worker  * Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker  *
5*cc02d7e2SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker  *
9*cc02d7e2SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker  *
11*cc02d7e2SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker  * limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker  *
17*cc02d7e2SAndroid Build Coastguard Worker  */
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #import <Foundation/Foundation.h>
20*cc02d7e2SAndroid Build Coastguard Worker 
21*cc02d7e2SAndroid Build Coastguard Worker #import "GRXWriteable.h"
22*cc02d7e2SAndroid Build Coastguard Worker 
23*cc02d7e2SAndroid Build Coastguard Worker /** States of a writer. */
24*cc02d7e2SAndroid Build Coastguard Worker typedef NS_ENUM(NSInteger, GRXWriterState) {
25*cc02d7e2SAndroid Build Coastguard Worker 
26*cc02d7e2SAndroid Build Coastguard Worker   /**
27*cc02d7e2SAndroid Build Coastguard Worker    * The writer has not yet been given a writeable to which it can push its values. To have a writer
28*cc02d7e2SAndroid Build Coastguard Worker    * transition to the Started state, send it a startWithWriteable: message.
29*cc02d7e2SAndroid Build Coastguard Worker    *
30*cc02d7e2SAndroid Build Coastguard Worker    * A writer's state cannot be manually set to this value.
31*cc02d7e2SAndroid Build Coastguard Worker    */
32*cc02d7e2SAndroid Build Coastguard Worker   GRXWriterStateNotStarted,
33*cc02d7e2SAndroid Build Coastguard Worker 
34*cc02d7e2SAndroid Build Coastguard Worker   /** The writer might push values to the writeable at any moment. */
35*cc02d7e2SAndroid Build Coastguard Worker   GRXWriterStateStarted,
36*cc02d7e2SAndroid Build Coastguard Worker 
37*cc02d7e2SAndroid Build Coastguard Worker   /**
38*cc02d7e2SAndroid Build Coastguard Worker    * The writer is temporarily paused, and won't send any more values to the writeable unless its
39*cc02d7e2SAndroid Build Coastguard Worker    * state is set back to Started. The writer might still transition to the Finished state at any
40*cc02d7e2SAndroid Build Coastguard Worker    * moment, and is allowed to send writesFinishedWithError: to its writeable.
41*cc02d7e2SAndroid Build Coastguard Worker    */
42*cc02d7e2SAndroid Build Coastguard Worker   GRXWriterStatePaused,
43*cc02d7e2SAndroid Build Coastguard Worker 
44*cc02d7e2SAndroid Build Coastguard Worker   /**
45*cc02d7e2SAndroid Build Coastguard Worker    * The writer has released its writeable and won't interact with it anymore.
46*cc02d7e2SAndroid Build Coastguard Worker    *
47*cc02d7e2SAndroid Build Coastguard Worker    * One seldom wants to set a writer's state to this value, as its writeable isn't notified with
48*cc02d7e2SAndroid Build Coastguard Worker    * a writesFinishedWithError: message. Instead, sending finishWithError: to the writer will make
49*cc02d7e2SAndroid Build Coastguard Worker    * it notify the writeable and then transition to this state.
50*cc02d7e2SAndroid Build Coastguard Worker    */
51*cc02d7e2SAndroid Build Coastguard Worker   GRXWriterStateFinished
52*cc02d7e2SAndroid Build Coastguard Worker };
53*cc02d7e2SAndroid Build Coastguard Worker 
54*cc02d7e2SAndroid Build Coastguard Worker /**
55*cc02d7e2SAndroid Build Coastguard Worker  * An GRXWriter object can produce, on demand, a sequence of values. The sequence may be produced
56*cc02d7e2SAndroid Build Coastguard Worker  * asynchronously, and it may consist of any number of elements, including none or an infinite
57*cc02d7e2SAndroid Build Coastguard Worker  * number.
58*cc02d7e2SAndroid Build Coastguard Worker  *
59*cc02d7e2SAndroid Build Coastguard Worker  * GRXWriter is the active dual of NSEnumerator. The difference between them is thus whether the
60*cc02d7e2SAndroid Build Coastguard Worker  * object plays an active or passive role during usage: A user of NSEnumerator pulls values off it,
61*cc02d7e2SAndroid Build Coastguard Worker  * and passes the values to a writeable. A user of GRXWriter, though, just gives it a writeable, and
62*cc02d7e2SAndroid Build Coastguard Worker  * the GRXWriter instance pushes values to the writeable. This makes this protocol suitable to
63*cc02d7e2SAndroid Build Coastguard Worker  * represent a sequence of future values, as well as collections with internal iteration.
64*cc02d7e2SAndroid Build Coastguard Worker  *
65*cc02d7e2SAndroid Build Coastguard Worker  * An instance of GRXWriter can start producing values after a writeable is passed to it. It can
66*cc02d7e2SAndroid Build Coastguard Worker  * also be commanded to finish the sequence immediately (with an optional error). Finally, it can be
67*cc02d7e2SAndroid Build Coastguard Worker  * asked to pause, and resumed later. All GRXWriter objects support pausing and early termination.
68*cc02d7e2SAndroid Build Coastguard Worker  *
69*cc02d7e2SAndroid Build Coastguard Worker  * Thread-safety:
70*cc02d7e2SAndroid Build Coastguard Worker  *
71*cc02d7e2SAndroid Build Coastguard Worker  * State transitions take immediate effect if the object is used from a single thread. Subclasses
72*cc02d7e2SAndroid Build Coastguard Worker  * might offer stronger guarantees.
73*cc02d7e2SAndroid Build Coastguard Worker  *
74*cc02d7e2SAndroid Build Coastguard Worker  * Unless otherwise indicated by a conforming subclass, no messages should be sent concurrently to a
75*cc02d7e2SAndroid Build Coastguard Worker  * GRXWriter. I.e., conforming classes aren't required to be thread-safe.
76*cc02d7e2SAndroid Build Coastguard Worker  */
77*cc02d7e2SAndroid Build Coastguard Worker @interface GRXWriter : NSObject
78*cc02d7e2SAndroid Build Coastguard Worker 
79*cc02d7e2SAndroid Build Coastguard Worker /**
80*cc02d7e2SAndroid Build Coastguard Worker  * This property can be used to query the current state of the writer, which determines how it might
81*cc02d7e2SAndroid Build Coastguard Worker  * currently use its writeable. Some state transitions can be triggered by setting this property to
82*cc02d7e2SAndroid Build Coastguard Worker  * the corresponding value, and that's useful for advanced use cases like pausing an writer. For
83*cc02d7e2SAndroid Build Coastguard Worker  * more details, see the documentation of the enum further down. The property is thread safe.
84*cc02d7e2SAndroid Build Coastguard Worker  */
85*cc02d7e2SAndroid Build Coastguard Worker @property GRXWriterState state;
86*cc02d7e2SAndroid Build Coastguard Worker 
87*cc02d7e2SAndroid Build Coastguard Worker /**
88*cc02d7e2SAndroid Build Coastguard Worker  * Transition to the Started state, and start sending messages to the writeable (a reference to it
89*cc02d7e2SAndroid Build Coastguard Worker  * is retained). Messages to the writeable may be sent before the method returns, or they may be
90*cc02d7e2SAndroid Build Coastguard Worker  * sent later in the future. See GRXWriteable.h for the different messages a writeable can receive.
91*cc02d7e2SAndroid Build Coastguard Worker  *
92*cc02d7e2SAndroid Build Coastguard Worker  * If this writer draws its values from an external source (e.g. from the filesystem or from a
93*cc02d7e2SAndroid Build Coastguard Worker  * server), calling this method will commonly trigger side effects (like network connections).
94*cc02d7e2SAndroid Build Coastguard Worker  *
95*cc02d7e2SAndroid Build Coastguard Worker  * This method might only be called on writers in the NotStarted state.
96*cc02d7e2SAndroid Build Coastguard Worker  */
97*cc02d7e2SAndroid Build Coastguard Worker - (void)startWithWriteable:(id<GRXWriteable>)writeable;
98*cc02d7e2SAndroid Build Coastguard Worker 
99*cc02d7e2SAndroid Build Coastguard Worker /**
100*cc02d7e2SAndroid Build Coastguard Worker  * Send writesFinishedWithError:errorOrNil to the writeable. Then release the reference to it and
101*cc02d7e2SAndroid Build Coastguard Worker  * transition to the Finished state.
102*cc02d7e2SAndroid Build Coastguard Worker  *
103*cc02d7e2SAndroid Build Coastguard Worker  * This method might only be called on writers in the Started or Paused state.
104*cc02d7e2SAndroid Build Coastguard Worker  */
105*cc02d7e2SAndroid Build Coastguard Worker - (void)finishWithError:(NSError *)errorOrNil;
106*cc02d7e2SAndroid Build Coastguard Worker @end
107