/*
* Copyright (C) 2015 Actor LLC. <https://actor.im>
*/
package im.actor.runtime.generic.mvvm;
import java.util.ArrayList;
import java.util.List;
// Disabling Bounds checks for speeding up calculations
/*-[
#define J2OBJC_DISABLE_ARRAY_BOUND_CHECKS 1
]-*/
public class ChangeDescription<T> {
public static <T> ChangeDescription<T> mergeAdd(ChangeDescription<T> a, ChangeDescription<T> b) {
ArrayList<T> items = new ArrayList<T>();
items.addAll(a.getItems());
items.addAll(b.getItems());
return new ChangeDescription<T>(OperationType.ADD, a.getIndex(), 0, items.size(), items);
}
public static <T> ChangeDescription<T> add(int index, T item) {
ArrayList<T> items = new ArrayList<T>();
items.add(item);
return add(index, items);
}
public static <T> ChangeDescription<T> add(int index, List<T> items) {
return new ChangeDescription<T>(OperationType.ADD, index, 0, items.size(),
new ArrayList<T>(items));
}
public static <T> ChangeDescription<T> remove(int index) {
return remove(index, 1);
}
public static <T> ChangeDescription<T> remove(int index, int length) {
return new ChangeDescription<T>(OperationType.REMOVE, index, 0, length, null);
}
public static <T> ChangeDescription<T> update(int index, T item) {
ArrayList<T> items = new ArrayList<T>();
items.add(item);
return update(index, items);
}
public static <T> ChangeDescription<T> update(int index, List<T> items) {
return new ChangeDescription<T>(OperationType.UPDATE, index, 0, items.size(),
new ArrayList<T>(items));
}
public static <T> ChangeDescription<T> move(int index, int destIndex) {
return new ChangeDescription<T>(OperationType.MOVE, index, destIndex, 1, null);
}
private OperationType operationType;
private int index;
private int destIndex;
private int length;
private ArrayList<T> item;
private ChangeDescription(OperationType operationType, int index, int destIndex, int length,
ArrayList<T> item) {
this.operationType = operationType;
this.index = index;
this.destIndex = destIndex;
this.length = length;
this.item = item;
}
public OperationType getOperationType() {
return operationType;
}
public int getIndex() {
return index;
}
public int getDestIndex() {
return destIndex;
}
public int getLength() {
return length;
}
public ArrayList<T> getItems() {
return item;
}
public <V> ChangeDescription<V> cast() {
return (ChangeDescription<V>) this;
}
public enum OperationType {
ADD, REMOVE, UPDATE, MOVE
}
@Override
public String toString() {
return "{" + operationType +
" | " + index + " -> " + destIndex +
" | #" + length +
" | " + item + '}';
}
}