Empty.java
001 /*
002  * Java Genetic Algorithm Library (jenetics-3.5.0).
003  * Copyright (c) 2007-2016 Franz Wilhelmstötter
004  *
005  * Licensed under the Apache License, Version 2.0 (the "License");
006  * you may not use this file except in compliance with the License.
007  * You may obtain a copy of the License at
008  *
009  *      http://www.apache.org/licenses/LICENSE-2.0
010  *
011  * Unless required by applicable law or agreed to in writing, software
012  * distributed under the License is distributed on an "AS IS" BASIS,
013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014  * See the License for the specific language governing permissions and
015  * limitations under the License.
016  *
017  * Author:
018  *    Franz Wilhelmstötter (franz.wilhelmstoetter@gmx.at)
019  */
020 package org.jenetics.internal.collection;
021 
022 import static java.util.Objects.requireNonNull;
023 
024 import java.util.Collections;
025 import java.util.Iterator;
026 import java.util.List;
027 import java.util.ListIterator;
028 import java.util.Spliterator;
029 import java.util.Spliterators;
030 import java.util.function.Function;
031 import java.util.stream.Stream;
032 
033 import org.jenetics.internal.util.require;
034 
035 import org.jenetics.util.ISeq;
036 import org.jenetics.util.MSeq;
037 
038 /**
039  * Contains static {@code Seq} definitions.
040  *
041  * @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
042  * @version 3.4
043  * @since 3.4
044  */
045 public final class Empty {
046 
047     private Empty() {require.noInstance();}
048 
049     /**
050      * Empty {@code MSeq} implementation.
051      */
052     public static final MSeq<Object> MSEQ = new MSeq<Object>() {
053 
054         @Override
055         public void set(final int index, final Object value) {
056             throw new ArrayIndexOutOfBoundsException("MSeq is empty.");
057         }
058 
059         @Override
060         public ListIterator<Object> listIterator() {
061             return asList().listIterator();
062         }
063 
064         @Override
065         public MSeq<Object> subSeq(final int start, final int end) {
066             throw new ArrayIndexOutOfBoundsException("MSeq is empty.");
067         }
068 
069         @Override
070         public MSeq<Object> subSeq(final int start) {
071             throw new ArrayIndexOutOfBoundsException("MSeq is empty.");
072         }
073 
074         @Override
075         public <B> MSeq<B> map(final Function<? super Object, ? extends B> mapper) {
076             requireNonNull(mapper);
077             return mseq();
078         }
079 
080         @Override
081         public MSeq<Object> append(final Object... values) {
082             return MSeq.of(values);
083         }
084 
085         @Override
086         public MSeq<Object> append(final Iterable<?> values) {
087             return MSeq.of(values);
088         }
089 
090         @Override
091         public MSeq<Object> prepend(final Object... values) {
092             return MSeq.of(values);
093         }
094 
095         @Override
096         public MSeq<Object> prepend(final Iterable<?> values) {
097             return MSeq.of(values);
098         }
099 
100         @Override
101         public Stream<Object> stream() {
102             return Stream.empty();
103         }
104 
105         @Override
106         public Stream<Object> parallelStream() {
107             return Stream.empty();
108         }
109 
110         @Override
111         public Spliterator<Object> spliterator() {
112             return Spliterators.emptySpliterator();
113         }
114 
115         @Override
116         public ISeq<Object> toISeq() {
117             return ISEQ;
118         }
119 
120         @Override
121         public MSeq<Object> copy() {
122             return this;
123         }
124 
125         @Override
126         public Object get(final int index) {
127             throw new ArrayIndexOutOfBoundsException("MSeq is empty.");
128         }
129 
130         @Override
131         public int length() {
132             return 0;
133         }
134 
135         @Override
136         public List<Object> asList() {
137             return Collections.emptyList();
138         }
139 
140         @Override
141         public Iterator<Object> iterator() {
142             return asList().iterator();
143         }
144 
145     };
146 
147 
148     /**
149      * Empty {@code ISeq} implementation.
150      */
151     public static final ISeq<Object> ISEQ = new ISeq<Object>() {
152 
153         @Override
154         public Iterator<Object> iterator() {
155             return asList().iterator();
156         }
157 
158         @Override
159         public ISeq<Object> subSeq(final int start, final int end) {
160             throw new ArrayIndexOutOfBoundsException("ISeq is empty.");
161         }
162 
163         @Override
164         public ISeq<Object> subSeq(final int start) {
165             throw new ArrayIndexOutOfBoundsException("ISeq is empty.");
166         }
167 
168         @Override
169         public Object get(final int index) {
170             throw new ArrayIndexOutOfBoundsException("ISeq is empty.");
171         }
172 
173         @Override
174         public int length() {
175             return 0;
176         }
177 
178         @Override
179         public List<Object> asList() {
180             return Collections.emptyList();
181         }
182 
183         @Override
184         public <B> ISeq<B> map(final Function<? super Object, ? extends B> mapper) {
185             requireNonNull(mapper);
186             return iseq();
187         }
188 
189         @Override
190         public ISeq<Object> append(final Object... values) {
191             return ISeq.of(values);
192         }
193 
194         @Override
195         public ISeq<Object> append(final Iterable<?> values) {
196             return ISeq.of(values);
197         }
198 
199         @Override
200         public ISeq<Object> prepend(final Object... values) {
201             return ISeq.of(values);
202         }
203 
204         @Override
205         public ISeq<Object> prepend(final Iterable<?> values) {
206             return ISeq.of(values);
207         }
208 
209         @Override
210         public Stream<Object> stream() {
211             return Stream.empty();
212         }
213 
214         @Override
215         public Stream<Object> parallelStream() {
216             return Stream.empty();
217         }
218 
219         @Override
220         public Spliterator<Object> spliterator() {
221             return Spliterators.emptySpliterator();
222         }
223 
224         @Override
225         public MSeq<Object> copy() {
226             return MSEQ;
227         }
228 
229     };
230 
231     @SuppressWarnings("unchecked")
232     public static <T> MSeq<T> mseq() {
233         return (MSeq<T>)MSEQ;
234     }
235 
236     @SuppressWarnings("unchecked")
237     public static <T> ISeq<T> iseq() {
238         return (ISeq<T>)ISEQ;
239     }
240 
241 }