static <T> BitMappedTrie<T> ofAll(Object array) { final ArrayType<T> type = ArrayType.of(array); final int size = type.lengthOf(array); return (size == 0) ? empty() : ofAll(array, type, size); } private static <T> BitMappedTrie<T> ofAll(Object array, ArrayType<T> type, int size) {
BitMappedTrie<T> drop(int n) { if (n <= 0) { return this; } else if (n >= length) { return empty(); } else { final int index = offset + n; final Object root = arePointingToSameLeaf(0, n) ? array : modify(array, depthShift, index, obj()::copyDrop, IDENTITY); return collapsed(type, root, index, length - n, depthShift); } }
BitMappedTrie<T> take(int n) { if (n >= length) { return this; } else if (n <= 0) { return empty(); } else { final int index = n - 1; final Object root = arePointingToSameLeaf(index, length - 1) ? array : modify(array, depthShift, offset + index, obj()::copyTake, IDENTITY); return collapsed(type, root, offset, n, depthShift); } }
static <T> BitMappedTrie<T> ofAll(Object array) { final ArrayType<T> type = ArrayType.of(array); final int size = type.lengthOf(array); return (size == 0) ? empty() : ofAll(array, type, size); } private static <T> BitMappedTrie<T> ofAll(Object array, ArrayType<T> type, int size) {
BitMappedTrie<T> drop(int n) { if (n <= 0) { return this; } else if (n >= length) { return empty(); } else { final int index = offset + n; final Object root = arePointingToSameLeaf(0, n) ? array : modify(array, depthShift, index, obj()::copyDrop, IDENTITY); return collapsed(type, root, index, length - n, depthShift); } }
BitMappedTrie<T> take(int n) { if (n >= length) { return this; } else if (n <= 0) { return empty(); } else { final int index = n - 1; final Object root = arePointingToSameLeaf(index, length - 1) ? array : modify(array, depthShift, offset + index, obj()::copyTake, IDENTITY); return collapsed(type, root, offset, n, depthShift); } }