12
12
*/
13
13
package io .reactivex .rxjava3 .disposables ;
14
14
15
+ import io .reactivex .rxjava3 .annotations .NonNull ;
16
+ import io .reactivex .rxjava3 .functions .Action ;
17
+ import io .reactivex .rxjava3 .internal .disposables .EmptyDisposable ;
18
+ import io .reactivex .rxjava3 .internal .functions .Functions ;
19
+ import org .reactivestreams .Subscription ;
20
+
21
+ import java .util .Objects ;
22
+ import java .util .concurrent .Future ;
23
+
15
24
/**
16
25
* Represents a disposable resource.
17
26
*/
@@ -26,4 +35,118 @@ public interface Disposable {
26
35
* @return true if this resource has been disposed
27
36
*/
28
37
boolean isDisposed ();
38
+
39
+ /**
40
+ * Construct a {@code Disposable} by wrapping a {@link Runnable} that is
41
+ * executed exactly once when the {@code Disposable} is disposed.
42
+ * @param run the Runnable to wrap
43
+ * @return the new Disposable instance
44
+ * @since 3.0.0
45
+ */
46
+ @ NonNull
47
+ static Disposable fromRunnable (@ NonNull Runnable run ) {
48
+ Objects .requireNonNull (run , "run is null" );
49
+ return new RunnableDisposable (run );
50
+ }
51
+
52
+ /**
53
+ * Construct a {@code Disposable} by wrapping a {@link Action} that is
54
+ * executed exactly once when the {@code Disposable} is disposed.
55
+ * @param run the Action to wrap
56
+ * @return the new Disposable instance
57
+ * @since 3.0.0
58
+ */
59
+ @ NonNull
60
+ static Disposable fromAction (@ NonNull Action run ) {
61
+ Objects .requireNonNull (run , "run is null" );
62
+ return new ActionDisposable (run );
63
+ }
64
+
65
+ /**
66
+ * Construct a {@code Disposable} by wrapping a {@link Future} that is
67
+ * cancelled exactly once when the {@code Disposable} is disposed.
68
+ * <p>
69
+ * The {@code Future} is cancelled with {@code mayInterruptIfRunning == true}.
70
+ * @param future the Future to wrap
71
+ * @return the new Disposable instance
72
+ * @see #fromFuture(Future, boolean)
73
+ * @since 3.0.0
74
+ */
75
+ @ NonNull
76
+ static Disposable fromFuture (@ NonNull Future <?> future ) {
77
+ Objects .requireNonNull (future , "future is null" );
78
+ return fromFuture (future , true );
79
+ }
80
+
81
+ /**
82
+ * Construct a {@code Disposable} by wrapping a {@link Future} that is
83
+ * cancelled exactly once when the {@code Disposable} is disposed.
84
+ * @param future the Future to wrap
85
+ * @param allowInterrupt if true, the future cancel happens via {@code Future.cancel(true)}
86
+ * @return the new Disposable instance
87
+ * @since 3.0.0
88
+ */
89
+ @ NonNull
90
+ static Disposable fromFuture (@ NonNull Future <?> future , boolean allowInterrupt ) {
91
+ Objects .requireNonNull (future , "future is null" );
92
+ return new FutureDisposable (future , allowInterrupt );
93
+ }
94
+
95
+ /**
96
+ * Construct a {@code Disposable} by wrapping a {@link Subscription} that is
97
+ * cancelled exactly once when the {@code Disposable} is disposed.
98
+ * @param subscription the Runnable to wrap
99
+ * @return the new Disposable instance
100
+ * @since 3.0.0
101
+ */
102
+ @ NonNull
103
+ static Disposable fromSubscription (@ NonNull Subscription subscription ) {
104
+ Objects .requireNonNull (subscription , "subscription is null" );
105
+ return new SubscriptionDisposable (subscription );
106
+ }
107
+
108
+ /**
109
+ * Construct a {@code Disposable} by wrapping an {@link AutoCloseable} that is
110
+ * closed exactly once when the {@code Disposable} is disposed.
111
+ * @param autoCloseable the AutoCloseable to wrap
112
+ * @return the new Disposable instance
113
+ * @since 3.0.0
114
+ */
115
+ @ NonNull
116
+ static Disposable fromAutoCloseable (@ NonNull AutoCloseable autoCloseable ) {
117
+ Objects .requireNonNull (autoCloseable , "autoCloseable is null" );
118
+ return new AutoCloseableDisposable (autoCloseable );
119
+ }
120
+
121
+ /**
122
+ * Construct an {@link AutoCloseable} by wrapping a {@code Disposable} that is
123
+ * disposed when the returned {@code AutoCloseable} is closed.
124
+ * @param disposable the Disposable instance
125
+ * @return the new AutoCloseable instance
126
+ * @since 3.0.0
127
+ */
128
+ @ NonNull
129
+ static AutoCloseable toAutoCloseable (@ NonNull Disposable disposable ) {
130
+ return disposable ::dispose ;
131
+ }
132
+
133
+ /**
134
+ * Returns a new, non-disposed {@code Disposable} instance.
135
+ * @return a new, non-disposed {@code Disposable} instance
136
+ * @since 3.0.0
137
+ */
138
+ @ NonNull
139
+ static Disposable empty () {
140
+ return fromRunnable (Functions .EMPTY_RUNNABLE );
141
+ }
142
+
143
+ /**
144
+ * Returns a shared, disposed {@code Disposable} instance.
145
+ * @return a shared, disposed {@code Disposable} instance
146
+ * @since 3.0.0
147
+ */
148
+ @ NonNull
149
+ static Disposable disposed () {
150
+ return EmptyDisposable .INSTANCE ;
151
+ }
29
152
}
0 commit comments