1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.commons.io.function;
19
20 import java.io.Closeable;
21 import java.io.IOException;
22 import java.io.UncheckedIOException;
23 import java.util.stream.BaseStream;
24 import java.util.stream.Stream;
25
26 /**
27 * Like {@link BaseStream} but throws {@link IOException}.
28 *
29 * @param <T> the type of the stream elements.
30 * @param <S> the type of the IO stream extending {@code IOBaseStream}.
31 * @param <B> the type of the stream extending {@code BaseStream}.
32 * @since 2.12.0
33 */
34 public interface IOBaseStream<T, S extends IOBaseStream<T, S, B>, B extends BaseStream<T, B>> extends Closeable {
35
36 /**
37 * Constructs a {@link BaseStream} for this instance that throws {@link UncheckedIOException} instead of
38 * {@link IOException}.
39 *
40 * @return an {@link UncheckedIOException} {@link BaseStream}.
41 */
42 @SuppressWarnings("unchecked")
43 default BaseStream<T, B> asBaseStream() {
44 return new UncheckedIOBaseStream<>((S) this);
45 }
46
47 /**
48 * Like {@link BaseStream#close()}.
49 *
50 * @see BaseStream#close()
51 */
52 @Override
53 default void close() {
54 unwrap().close();
55 }
56
57 /**
58 * Like {@link BaseStream#isParallel()}.
59 *
60 * @return See {@link BaseStream#isParallel() delegate}.
61 * @see BaseStream#isParallel()
62 */
63 @SuppressWarnings("resource") // for unwrap()
64 default boolean isParallel() {
65 return unwrap().isParallel();
66 }
67
68 /**
69 * Like {@link BaseStream#iterator()}.
70 *
71 * @return See {@link BaseStream#iterator() delegate}.
72 * @see BaseStream#iterator()
73 */
74 @SuppressWarnings("resource") // for unwrap()
75 default IOIterator<T> iterator() {
76 return IOIteratorAdapter.adapt(unwrap().iterator());
77 }
78
79 /**
80 * Like {@link BaseStream#onClose(Runnable)}.
81 *
82 * @param closeHandler See {@link BaseStream#onClose(Runnable) delegate}.
83 * @return See {@link BaseStream#onClose(Runnable) delegate}.
84 * @throws IOException if an I/O error occurs.
85 * @see BaseStream#onClose(Runnable)
86 */
87 @SuppressWarnings({"unused", "resource"}) // throws IOException, unwrap()
88 default S onClose(final IORunnable closeHandler) throws IOException {
89 return wrap(unwrap().onClose(() -> Erase.run(closeHandler)));
90 }
91
92 /**
93 * Like {@link BaseStream#parallel()}.
94 *
95 * @return See {@link BaseStream#parallel() delegate}.
96 * @see BaseStream#parallel()
97 */
98 @SuppressWarnings({"resource", "unchecked"}) // for unwrap(), this
99 default S parallel() {
100 return isParallel() ? (S) this : wrap(unwrap().parallel());
101 }
102
103 /**
104 * Like {@link BaseStream#sequential()}.
105 *
106 * @return See {@link BaseStream#sequential() delegate}.
107 * @see BaseStream#sequential()
108 */
109 @SuppressWarnings({"resource", "unchecked"}) // for unwrap(), this
110 default S sequential() {
111 return isParallel() ? wrap(unwrap().sequential()) : (S) this;
112 }
113
114 /**
115 * Like {@link BaseStream#spliterator()}.
116 *
117 * @return See {@link BaseStream#spliterator() delegate}.
118 * @see BaseStream#spliterator()
119 */
120 @SuppressWarnings("resource") // for unwrap()
121 default IOSpliterator<T> spliterator() {
122 return IOSpliteratorAdapter.adapt(unwrap().spliterator());
123 }
124
125 /**
126 * Like {@link BaseStream#unordered()}.
127 *
128 * @return See {@link BaseStream#unordered() delegate}.
129 * @see java.util.stream.BaseStream#unordered()
130 */
131 @SuppressWarnings("resource") // for unwrap()
132 default S unordered() {
133 return wrap(unwrap().unordered());
134 }
135
136 /**
137 * Unwraps this instance and returns the underlying {@link Stream}.
138 * <p>
139 * Implementations may not have anything to unwrap and that behavior is undefined for now.
140 * </p>
141 *
142 * @return the underlying stream.
143 */
144 B unwrap();
145
146 /**
147 * Wraps a {@link Stream}.
148 *
149 * @param delegate The delegate.
150 * @return An IO stream.
151 */
152 S wrap(B delegate);
153
154 }