// Path: src/main/java/ru/shadam/tarantool/core/convert/Path.java
// public class Path {
//     private List<Integer> indexes;
// 
//     private Path(List<Integer> indexes) {
//         this.indexes = Objects.requireNonNull(indexes);
//     }
// 
//     public List<Integer> getIndexes() {
//         return Collections.unmodifiableList(indexes);
//     }
// 
//     public static Path empty() {
//         return new Path(Collections.emptyList());
//     }
// 
//     public static Path of(Integer index) {
//         Assert.notNull(index, "index cannot be null");
// 
//         return new Path(Collections.singletonList(index));
//     }
// 
//     public static Path of(Integer... indexes) {
//         Assert.noNullElements(indexes);
// 
//         return new Path(Arrays.asList(indexes));
//     }
// 
//     public static Path concat(Path path, Integer index) {
//         Assert.notNull(index, "index cannot be null");
// 
//         if(path.isEmpty()) {
//             return Path.of(index);
//         }
// 
//         final List<Integer> list = new ArrayList<>();
//         list.addAll(path.indexes);
//         list.add(index);
//         return new Path(list);
//     }
// 
//     public boolean isEmpty() {
//         return indexes.isEmpty();
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         final Path path = (Path) o;
// 
//         return indexes.equals(path.indexes);
//     }
// 
//     @Override
//     public int hashCode() {
//         return indexes.hashCode();
//     }
// 
//     @Override
//     public String toString() {
//         return "Path{" +
//                 "indexes=" + indexes +
//                 '}';
//     }
// }
// 
// Path: src/main/java/ru/shadam/tarantool/core/convert/Tuple.java
// public class Tuple {
//     private final List<Object> inner;
// 
//     public Tuple() {
//         this.inner = new ArrayList<>();
//     }
// 
//     public Tuple(List<Object> inner) {
//         this.inner = inner;
//     }
// 
//     public Object get(Path path) {
//         return getInternal(inner, path.getIndexes());
//     }
// 
//     @SuppressWarnings("unchecked")
//     private static Object getInternal(List<Object> inner, List<Integer> indexes) {
//         if(indexes.isEmpty()) {
//             return inner;
//         }
//         final Integer headIndex = indexes.get(0);
//         if(indexes.size() == 1) {
//             if(inner.size() <= headIndex) {
//                 return null;
//             }
//             return inner.get(headIndex);
//         }
//         final List<Integer> tailIndexes = indexes.subList(1, indexes.size());
//         final List<Object> tuple = (List<Object>) inner.get(headIndex);
//         return getInternal(tuple, tailIndexes);
//     }
// 
//     public void set(Path path, Object value) {
//         setInternal(inner, path.getIndexes(), value);
//     }
// 
//     @SuppressWarnings("unchecked")
//     private static void setInternal(List<Object> inner, List<Integer> indexes, Object value) {
//         if(indexes.isEmpty()) {
//             throw new IllegalArgumentException("indexes should not be empty");
//         }
//         final Integer index = indexes.get(0);
//         ensureCapacity(inner, index);
//         if(indexes.size() == 1) {
//             inner.set(index, value);
//             return;
//         }
//         final List<Object> tuple;
//         if(inner.get(index) == null) {
//             tuple = new ArrayList<>();
//             inner.set(index, tuple);
//         } else {
//             tuple = (List<Object>) inner.get(index);
//         }
//         setInternal(tuple, indexes.subList(1, indexes.size()), value);
//     }
// 
//     private static void ensureCapacity(List<Object> inner, int size) {
//         int startSize = inner.size();
//         for(int i = startSize; i <= size; i++) {
//             inner.add(null);
//         }
//     }
// 
//     public int size() {
//         return inner.size();
//     }
// 
//     public boolean isEmpty() {
//         return inner.isEmpty();
//     }
// 
//     public Tuple extract(Path currentPath) {
//         final Object value = get(currentPath);
//         final Tuple tuple = new Tuple();
//         tuple.set(currentPath, value);
//         return tuple;
//     }
// 
//     public List<Object> getRaw() {
//         return inner;
//     }
// 
//     public List<Path> extractAllKeysFor(Path path) {
//         final List<Object> internal = (List<Object>) get(path);
//         if(internal == null) {
//             return Collections.emptyList();
//         }
//         return IntStream.range(0, internal.size())
//                 .mapToObj(i -> Path.concat(path, i))
//                 .collect(Collectors.toList());
//     }
// 
// 
//     @Override
//     public String toString() {
//         return "Tuple{" +
//                 "inner=" + inner +
//                 '}';
//     }
// }


import ru.shadam.tarantool.core.convert.Path;
import ru.shadam.tarantool.core.convert.Tuple;
import java.util.List;
import java.util.Map;
package ru.shadam.tarantool.test.util;



/**
 * @author sala
 */
public class Tuples {
    public static Tuple of(Path key, Object value) {
        final Tuple tuple = new Tuple();
// Path: src/main/java/ru/shadam/tarantool/core/convert/Path.java
// public class Path {
//     private List<Integer> indexes;
// 
//     private Path(List<Integer> indexes) {
//         this.indexes = Objects.requireNonNull(indexes);
//     }
// 
//     public List<Integer> getIndexes() {
//         return Collections.unmodifiableList(indexes);
//     }
// 
//     public static Path empty() {
//         return new Path(Collections.emptyList());
//     }
// 
//     public static Path of(Integer index) {
//         Assert.notNull(index, "index cannot be null");
// 
//         return new Path(Collections.singletonList(index));
//     }
// 
//     public static Path of(Integer... indexes) {
//         Assert.noNullElements(indexes);
// 
//         return new Path(Arrays.asList(indexes));
//     }
// 
//     public static Path concat(Path path, Integer index) {
//         Assert.notNull(index, "index cannot be null");
// 
//         if(path.isEmpty()) {
//             return Path.of(index);
//         }
// 
//         final List<Integer> list = new ArrayList<>();
//         list.addAll(path.indexes);
//         list.add(index);
//         return new Path(list);
//     }
// 
//     public boolean isEmpty() {
//         return indexes.isEmpty();
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         final Path path = (Path) o;
// 
//         return indexes.equals(path.indexes);
//     }
// 
//     @Override
//     public int hashCode() {
//         return indexes.hashCode();
//     }
// 
//     @Override
//     public String toString() {
//         return "Path{" +
//                 "indexes=" + indexes +
//                 '}';
//     }
// }
// 
// Path: src/main/java/ru/shadam/tarantool/core/convert/Tuple.java
// public class Tuple {
//     private final List<Object> inner;
// 
//     public Tuple() {
//         this.inner = new ArrayList<>();
//     }
// 
//     public Tuple(List<Object> inner) {
//         this.inner = inner;
//     }
// 
//     public Object get(Path path) {
//         return getInternal(inner, path.getIndexes());
//     }
// 
//     @SuppressWarnings("unchecked")
//     private static Object getInternal(List<Object> inner, List<Integer> indexes) {
//         if(indexes.isEmpty()) {
//             return inner;
//         }
//         final Integer headIndex = indexes.get(0);
//         if(indexes.size() == 1) {
//             if(inner.size() <= headIndex) {
//                 return null;
//             }
//             return inner.get(headIndex);
//         }
//         final List<Integer> tailIndexes = indexes.subList(1, indexes.size());
//         final List<Object> tuple = (List<Object>) inner.get(headIndex);
//         return getInternal(tuple, tailIndexes);
//     }
// 
//     public void set(Path path, Object value) {
//         setInternal(inner, path.getIndexes(), value);
//     }
// 
//     @SuppressWarnings("unchecked")
//     private static void setInternal(List<Object> inner, List<Integer> indexes, Object value) {
//         if(indexes.isEmpty()) {
//             throw new IllegalArgumentException("indexes should not be empty");
//         }
//         final Integer index = indexes.get(0);
//         ensureCapacity(inner, index);
//         if(indexes.size() == 1) {
//             inner.set(index, value);
//             return;
//         }
//         final List<Object> tuple;
//         if(inner.get(index) == null) {
//             tuple = new ArrayList<>();
//             inner.set(index, tuple);
//         } else {
//             tuple = (List<Object>) inner.get(index);
//         }
//         setInternal(tuple, indexes.subList(1, indexes.size()), value);
//     }
// 
//     private static void ensureCapacity(List<Object> inner, int size) {
//         int startSize = inner.size();
//         for(int i = startSize; i <= size; i++) {
//             inner.add(null);
//         }
//     }
// 
//     public int size() {
//         return inner.size();
//     }
// 
//     public boolean isEmpty() {
//         return inner.isEmpty();
//     }
// 
//     public Tuple extract(Path currentPath) {
//         final Object value = get(currentPath);
//         final Tuple tuple = new Tuple();
//         tuple.set(currentPath, value);
//         return tuple;
//     }
// 
//     public List<Object> getRaw() {
//         return inner;
//     }
// 
//     public List<Path> extractAllKeysFor(Path path) {
//         final List<Object> internal = (List<Object>) get(path);
//         if(internal == null) {
//             return Collections.emptyList();
//         }
//         return IntStream.range(0, internal.size())
//                 .mapToObj(i -> Path.concat(path, i))
//                 .collect(Collectors.toList());
//     }
// 
// 
//     @Override
//     public String toString() {
//         return "Tuple{" +
//                 "inner=" + inner +
//                 '}';
//     }
// }


// Path: src/test/java/ru/shadam/tarantool/test/util/Tuples.java
import ru.shadam.tarantool.core.convert.Path;
import ru.shadam.tarantool.core.convert.Tuple;
import java.util.List;
import java.util.Map;

package ru.shadam.tarantool.test.util;



/**
 * @author sala
 */
public class Tuples {
    public static Tuple of(Path key, Object value) {
        final Tuple tuple = new Tuple();
        tuple.set(key, value);