001 /*
002 * Java Genetic Algorithm Library (jenetics-3.0.0).
003 * Copyright (c) 2007-2014 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.util;
021
022 import java.util.ArrayList;
023 import java.util.List;
024 import java.util.function.Function;
025 import java.util.function.Supplier;
026 import java.util.stream.Collector;
027
028 /**
029 * Immutable, ordered, fixed sized sequence.
030 *
031 * @see MSeq
032 *
033 * @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
034 * @since 1.0
035 * @version 3.0 — <em>$Date: 2014-12-28 $</em>
036 */
037 public interface ISeq<T>
038 extends
039 Seq<T>,
040 Copyable<MSeq<T>>
041 {
042
043 @Override
044 public ISeq<T> subSeq(final int start, final int end);
045
046 @Override
047 public ISeq<T> subSeq(final int start);
048
049 @Override
050 public <B> ISeq<B> map(final Function<? super T, ? extends B> mapper);
051
052 /**
053 * Return a shallow copy of this sequence. The sequence elements are not
054 * cloned.
055 *
056 * @return a shallow copy of this sequence.
057 */
058 @Override
059 public MSeq<T> copy();
060
061
062 /* *************************************************************************
063 * Some static factory methods.
064 * ************************************************************************/
065
066 /**
067 * Returns a {@code Collector} that accumulates the input elements into a
068 * new {@code ISeq}.
069 *
070 * @param <T> the type of the input elements
071 * @return a {@code Collector} which collects all the input elements into an
072 * {@code ISeq}, in encounter order
073 */
074 public static <T> Collector<T, ?, ISeq<T>> toISeq() {
075 return Collector.of(
076 (Supplier<List<T>>)ArrayList::new,
077 List::add,
078 (left, right) -> { left.addAll(right); return left; },
079 ISeq::of
080 );
081 }
082
083 /**
084 * Create a new {@code ISeq} from the given values.
085 *
086 * @param <T> the element type
087 * @param values the array values.
088 * @return a new {@code ISeq} with the given values.
089 * @throws NullPointerException if the {@code values} array is {@code null}.
090 */
091 @SafeVarargs
092 public static <T> ISeq<T> of(final T... values) {
093 return MSeq.of(values).toISeq();
094 }
095
096 /**
097 * Create a new {@code ISeq} from the given values.
098 *
099 * @param <T> the element type
100 * @param values the array values.
101 * @return a new {@code ISeq} with the given values.
102 * @throws NullPointerException if the {@code values} array is {@code null}.
103 */
104 @SuppressWarnings("unchecked")
105 public static <T> ISeq<T> of(final Iterable<? extends T> values) {
106 return values instanceof ISeq<?> ?
107 (ISeq<T>)values :
108 values instanceof MSeq<?> ?
109 ((MSeq<T>)values).toISeq() :
110 MSeq.of(values).toISeq();
111 }
112
113 public static <T> ISeq<T> of(Supplier<? extends T> supplier, final int length) {
114 return MSeq.<T>ofLength(length).fill(supplier).toISeq();
115 }
116
117 }
|