/*
* Copyright 2008-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.nominanuda.zen.obj;
import static com.nominanuda.zen.seq.Seq.SEQ;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import javax.annotation.Nullable;
import com.nominanuda.zen.stereotype.Value;
public interface TArr<T> extends Stru, List<T> {
public static <T> TArr<T> make(Class<T> cl, Object...vals) {
return Arr.makeTyped(cl, vals);
}
/**
* @see {@link List#set(int, Object)} */
// @Override
@Nullable <X> X store(int idx, @Nullable X v);
@Nullable
T fetch(int idx);
default Any fetchAny(int idx) {
return Any.toStruObjModel(fetch(idx));
}
@SuppressWarnings("unchecked")
default <X extends Any> X pushAny(X any) {
push((T)any.toJavaObjModel());
return any;
}
T del(int idx);
@Override
int len();
@Override
default TArr<T> copy() {
return this;
}
default boolean exists(int k) {
return k < len();
}
default int indexOf(Object v, int start) {
int i = 0;
for(Object o : this) {
if(Value.nullSafeEquals(o, v)) {
return i;
}
i++;
}
return -1;
}
@Override
default void sendTo(JixHandler sink) {
sink.startArr();
for(Object o : this) {
Any.toStruObjModel(o).sendTo(sink);
}
sink.endArr();
}
/**
*
* @param v
* @return the supplied Object
*/
<X extends T> X push(X v);
default boolean isValArr() {
for(Object x : this) {
if(! JsonType.isNullablePrimitive(x)) {
return false;
}
}
return true;
}
@Override
Arr reset();
@Override
default JsonType getType() {
return JsonType.arr;
}
default TArr<T> with(T val) {
push(val);
return this;
}
// default List<? extends T> asList() {
// return this;
// }
///////////////////List
@Override
default int size() {
return len();
}
@Override
default T set(int index, Object element) {
T ret = fetch(index);
store(index, element);
return ret;
}
@Override
default void clear() {
reset();
}
@Override
default T get(int index) {
return fetch(index);
}
@Override
default void add(int index, Object element) {
throw new UnsupportedOperationException("not implemented");
}
@Override
default T remove(int index) {
return del(index);
}
@Override
default int indexOf(Object o) {
return indexOf(o, 0);
}
@Override
default boolean add(T e) {
push((T)e);
return true;
}
@Override
default boolean remove(Object o) {
int i = indexOf(o);
if(i >= 0) {
remove(i);
return true;
} else {
return false;
}
}
@Override
default boolean isEmpty() {
return size() == 0;
}
@Override
default boolean containsAll(Collection<?> c) {
for(Object o : c) {
if(! contains(o)) {
return false;
}
}
return true;
}
@Override
default boolean contains(Object o) {
Iterator<T> i = iterator();
while(i.hasNext()) {
if(Value.nullSafeEquals(o, i.next())) {
return true;
}
}
return false;
}
@Override
default Object[] toArray() {
Object[] result = new Object[size()];
SEQ.writeToArray(this, result);
return result;
}
default <X> X[] toTypedArray(Class<X> elementType) {
return SEQ.toTypedArray(this, elementType);
}
@Override
@SuppressWarnings("unchecked")
default <X> X[] toArray(X[] a) {
int len = size();
if(a.length < len) {
return (X[])toTypedArray(a.getClass().getComponentType());
} else {
SEQ.writeToArray(this, a);
return a;
}
}
@Override
default boolean addAll(Collection<? extends T> c) {
boolean res = false;
for(T t : c) {
res = add(t) || res;
}
return res;
}
@Override
default boolean removeAll(Collection<?> c) {
boolean res = false;
for(Object t : c) {
res = remove(t) || res;
}
return res;
}
@Override
default boolean retainAll(Collection<?> c) {
throw new UnsupportedOperationException("read-only collection");
}
@Override
default int lastIndexOf(Object o) {
throw new UnsupportedOperationException("read-only collection");
}
@Override
ListIterator<T> listIterator();
@Override
default ListIterator<T> listIterator(int index) {
throw new UnsupportedOperationException("read-only collection");
}
@Override
default List<T> subList(int fromIndex, int toIndex) {
throw new UnsupportedOperationException("read-only collection");
}
@Override
default boolean addAll(int index, Collection<? extends T> c) {
throw new UnsupportedOperationException("read-only collection");
}
@SuppressWarnings("unchecked")
default <X> List<X> asListOf(Class<X> class1) {
return (List<X>) this;
}
}