// Path: src/main/java/net/kimleo/rec/common/concept/Mapped.java
// public interface Mapped<T> {
//     T get(String field);
// 
//     List<String> keys();
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/model/Source.java
// public interface Source<T> {
//     Stream<T> stream();
//     default Source<T> tee(Tee<T> tee) {
//         return () -> this.stream().map(tee::emit);
//     }
// 
//     default Source<T> filter(Predicate<T> predicate) {
//         return () -> this.stream().filter(predicate);
//     }
// 
//     default Source<T> skip(int n) {
//         return from(stream().skip(n));
//     }
// 
//     static <T> Source<T> from(Stream<T> records) {
//         return () -> records;
//     }
// 
//     default void to(Target<T> target) {
//         target.putAll(this);
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/model/mapper/ResultSetMapper.java
// public class ResultSetMapper implements Mapped<String> {
// 
//     private final ResultSet rs;
// 
//     public ResultSetMapper(ResultSet rs) {
//         this.rs = rs;
//     }
// 
//     @Override
//     public String get(String field) {
//         try {
//             return rs.getObject(field).toString();
//         } catch (SQLException e) {
//             e.printStackTrace();
//         }
//         return null;
//     }
// 
//     @Override
//     public List<String> keys() {
//         ArrayList<String> keys = new ArrayList<>();
//         try {
//             ResultSetMetaData metaData = rs.getMetaData();
//             for (int i = 0; i < metaData.getColumnCount(); i++) {
//                 keys.add(metaData.getColumnName(i + 1));
//             }
//         } catch (SQLException ignored) {
//             ignored.printStackTrace();
//         }
//         return keys;
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/stream/adapter/GeneratingSpliteratorAdapter.java
// public class GeneratingSpliteratorAdapter<T> extends Spliterators.AbstractSpliterator<T> {
// 
// 
//     private final Supplier<T> supplier;
// 
//     public GeneratingSpliteratorAdapter(Supplier<T> supplier) {
//         super(Long.MAX_VALUE, 0);
//         this.supplier = supplier;
//     }
// 
//     @Override
//     public boolean tryAdvance(Consumer<? super T> action) {
//         T item = supplier.get();
//         if (item != null) {
//             action.accept(item);
//             return true;
//         }
// 
//         return false;
//     }
// }


import net.kimleo.rec.common.concept.Mapped;
import net.kimleo.rec.v2.model.Source;
import net.kimleo.rec.v2.model.mapper.ResultSetMapper;
import net.kimleo.rec.v2.stream.adapter.GeneratingSpliteratorAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import static java.lang.String.format;
package net.kimleo.rec.v2.model.impl;




public class ResultSetSource implements Source<Mapped<String>> {
    private final ResultSet rs;
    private static final Logger LOGGER = LoggerFactory.getLogger(ResultSetSource.class);

    public ResultSetSource(ResultSet rs) {
        this.rs = rs;
    }

    @Override
    public Stream<Mapped<String>> stream() {
        return StreamSupport.stream(new GeneratingSpliteratorAdapter<Mapped<String>>(() -> {
            try {
                if (rs.next()) {
                    LOGGER.info(format("Get next item in result set #[%d]", rs.hashCode()));
// Path: src/main/java/net/kimleo/rec/common/concept/Mapped.java
// public interface Mapped<T> {
//     T get(String field);
// 
//     List<String> keys();
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/model/Source.java
// public interface Source<T> {
//     Stream<T> stream();
//     default Source<T> tee(Tee<T> tee) {
//         return () -> this.stream().map(tee::emit);
//     }
// 
//     default Source<T> filter(Predicate<T> predicate) {
//         return () -> this.stream().filter(predicate);
//     }
// 
//     default Source<T> skip(int n) {
//         return from(stream().skip(n));
//     }
// 
//     static <T> Source<T> from(Stream<T> records) {
//         return () -> records;
//     }
// 
//     default void to(Target<T> target) {
//         target.putAll(this);
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/model/mapper/ResultSetMapper.java
// public class ResultSetMapper implements Mapped<String> {
// 
//     private final ResultSet rs;
// 
//     public ResultSetMapper(ResultSet rs) {
//         this.rs = rs;
//     }
// 
//     @Override
//     public String get(String field) {
//         try {
//             return rs.getObject(field).toString();
//         } catch (SQLException e) {
//             e.printStackTrace();
//         }
//         return null;
//     }
// 
//     @Override
//     public List<String> keys() {
//         ArrayList<String> keys = new ArrayList<>();
//         try {
//             ResultSetMetaData metaData = rs.getMetaData();
//             for (int i = 0; i < metaData.getColumnCount(); i++) {
//                 keys.add(metaData.getColumnName(i + 1));
//             }
//         } catch (SQLException ignored) {
//             ignored.printStackTrace();
//         }
//         return keys;
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/stream/adapter/GeneratingSpliteratorAdapter.java
// public class GeneratingSpliteratorAdapter<T> extends Spliterators.AbstractSpliterator<T> {
// 
// 
//     private final Supplier<T> supplier;
// 
//     public GeneratingSpliteratorAdapter(Supplier<T> supplier) {
//         super(Long.MAX_VALUE, 0);
//         this.supplier = supplier;
//     }
// 
//     @Override
//     public boolean tryAdvance(Consumer<? super T> action) {
//         T item = supplier.get();
//         if (item != null) {
//             action.accept(item);
//             return true;
//         }
// 
//         return false;
//     }
// }


// Path: src/main/java/net/kimleo/rec/v2/model/impl/ResultSetSource.java
import net.kimleo.rec.common.concept.Mapped;
import net.kimleo.rec.v2.model.Source;
import net.kimleo.rec.v2.model.mapper.ResultSetMapper;
import net.kimleo.rec.v2.stream.adapter.GeneratingSpliteratorAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import static java.lang.String.format;

package net.kimleo.rec.v2.model.impl;




public class ResultSetSource implements Source<Mapped<String>> {
    private final ResultSet rs;
    private static final Logger LOGGER = LoggerFactory.getLogger(ResultSetSource.class);

    public ResultSetSource(ResultSet rs) {
        this.rs = rs;
    }

    @Override
    public Stream<Mapped<String>> stream() {
        return StreamSupport.stream(new GeneratingSpliteratorAdapter<Mapped<String>>(() -> {
            try {
                if (rs.next()) {
                    LOGGER.info(format("Get next item in result set #[%d]", rs.hashCode()));
                    return new ResultSetMapper(rs);