// 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/sepval/parser/ParseConfig.java
// public class ParseConfig {
//     public final char delimiter;
//     public final char escape;
// 
//     public static final ParseConfig DEFAULT = new ParseConfig();
//     public static final ParseConfig BY_PIPE = new ParseConfig('|');
// 
//     public ParseConfig(char delimiter, char escape) {
//         this.delimiter = delimiter;
//         this.escape = escape;
//     }
// 
//     public ParseConfig(char delimiter) {
//         this(delimiter, '"');
//     }
// 
//     public ParseConfig() {
//         this(',', '"');
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/sepval/parser/SimpleParser.java
// public class SimpleParser {
//     private final ParseConfig config;
// 
//     private final static Logger LOGGER = LoggerFactory.getLogger(SimpleParser.class);
// 
//     public SimpleParser(ParseConfig config) {
//         this.config = config;
//     }
// 
//     public SimpleParser() {
//         this(ParseConfig.DEFAULT);
//     }
// 
//     public SepValEntry parse(String input) {
//         ParseState state = new ParseState(input);
//         ArrayList<String> fields = new ArrayList<>();
//         while (!state.eof()) {
//             fields.add(parseField(state));
//         }
// 
//         if (state.of(state.getSize() - 1) == config.delimiter) {
//             LOGGER.warn(String.format("Found delimiter [%s] at end of record", config.delimiter));
//             fields.add("");
//         }
// 
//         return new SepValEntry(fields, input);
//     }
// 
//     private String parseField(ParseState state) {
//         StringBuilder builder = new StringBuilder();
//         Character c = state.current();
//         while (c != null && c != config.delimiter) {
//             if (builder.length() == 0) {
//                 if (isSpace(c)) {
//                     c = state.next();
//                     continue;
//                 }
//                 if (c == config.escape) {
//                     return parseEscaped(state);
//                 }
//             }
//             builder.append(c);
//             c = state.next();
//         }
//         state.next();
//         return builder.toString().trim();
//     }
// 
//     private String parseEscaped(ParseState state) {
// 
//         StringBuilder builder = new StringBuilder();
//         assert (state.current() == config.escape);
// 
//         Character c = state.next();
//         while (!state.eof() || c != config.delimiter) {
//             if (c == config.escape) {
//                 c = state.next();
//                 if (c == null || c != config.escape) {
//                     expectDelimiter(state);
//                     state.next();
//                     break;
//                 }
//             }
//             builder.append(c);
//             c = state.next();
//         }
//         return builder.toString();
//     }
// 
//     private void expectDelimiter(ParseState state) {
//         while (isSpace(state.current())) {
//             state.next();
//         }
// 
//         assert((state.current() == null || state.current() == config.delimiter));
//     }
// 
//     private boolean isSpace(Character c) {
//         return c != null && (c == ' ' || c == '\t');
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/accessor/Accessor.java
// public class Accessor<T> {
// 
//     private final Map<String, Integer> fieldMap;
//     private final Integer leastCapacity;
// 
//     public Accessor(String[] fields) {
//         Pair<Map<String, Integer>, Integer> fieldMapPair = Lexer.buildFieldMapPair(fields);
//         fieldMap = fieldMapPair.getFirst();
//         leastCapacity = fieldMapPair.getSecond();
//     }
// 
//     public Map<String, Integer> getFieldMap() {
//         return fieldMap;
//     }
// 
//     public Integer getLeastCapacity() {
//         return leastCapacity;
//     }
// 
//     public RecordWrapper<T> create(Accessible<T> record) {
//         assertTrue (record.size() >= leastCapacity);
// 
//         return new RecordWrapper<>(fieldMap, record);
//     }
// 
//     public RecordWrapper<T> of(Accessible<T> record) {
//         return create(record);
//     }
// }
// 
// 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);
//     }
// }


import net.kimleo.rec.common.concept.Mapped;
import net.kimleo.rec.sepval.parser.ParseConfig;
import net.kimleo.rec.sepval.parser.SimpleParser;
import net.kimleo.rec.v2.accessor.Accessor;
import net.kimleo.rec.v2.model.Source;
import java.io.BufferedReader;
import java.io.Reader;
import java.util.stream.Stream;
package net.kimleo.rec.v2.model.impl;



public class CSVSource implements Source<Mapped<String>> {

    private final BufferedReader reader;
    private final Accessor<String> accessor;
// 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/sepval/parser/ParseConfig.java
// public class ParseConfig {
//     public final char delimiter;
//     public final char escape;
// 
//     public static final ParseConfig DEFAULT = new ParseConfig();
//     public static final ParseConfig BY_PIPE = new ParseConfig('|');
// 
//     public ParseConfig(char delimiter, char escape) {
//         this.delimiter = delimiter;
//         this.escape = escape;
//     }
// 
//     public ParseConfig(char delimiter) {
//         this(delimiter, '"');
//     }
// 
//     public ParseConfig() {
//         this(',', '"');
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/sepval/parser/SimpleParser.java
// public class SimpleParser {
//     private final ParseConfig config;
// 
//     private final static Logger LOGGER = LoggerFactory.getLogger(SimpleParser.class);
// 
//     public SimpleParser(ParseConfig config) {
//         this.config = config;
//     }
// 
//     public SimpleParser() {
//         this(ParseConfig.DEFAULT);
//     }
// 
//     public SepValEntry parse(String input) {
//         ParseState state = new ParseState(input);
//         ArrayList<String> fields = new ArrayList<>();
//         while (!state.eof()) {
//             fields.add(parseField(state));
//         }
// 
//         if (state.of(state.getSize() - 1) == config.delimiter) {
//             LOGGER.warn(String.format("Found delimiter [%s] at end of record", config.delimiter));
//             fields.add("");
//         }
// 
//         return new SepValEntry(fields, input);
//     }
// 
//     private String parseField(ParseState state) {
//         StringBuilder builder = new StringBuilder();
//         Character c = state.current();
//         while (c != null && c != config.delimiter) {
//             if (builder.length() == 0) {
//                 if (isSpace(c)) {
//                     c = state.next();
//                     continue;
//                 }
//                 if (c == config.escape) {
//                     return parseEscaped(state);
//                 }
//             }
//             builder.append(c);
//             c = state.next();
//         }
//         state.next();
//         return builder.toString().trim();
//     }
// 
//     private String parseEscaped(ParseState state) {
// 
//         StringBuilder builder = new StringBuilder();
//         assert (state.current() == config.escape);
// 
//         Character c = state.next();
//         while (!state.eof() || c != config.delimiter) {
//             if (c == config.escape) {
//                 c = state.next();
//                 if (c == null || c != config.escape) {
//                     expectDelimiter(state);
//                     state.next();
//                     break;
//                 }
//             }
//             builder.append(c);
//             c = state.next();
//         }
//         return builder.toString();
//     }
// 
//     private void expectDelimiter(ParseState state) {
//         while (isSpace(state.current())) {
//             state.next();
//         }
// 
//         assert((state.current() == null || state.current() == config.delimiter));
//     }
// 
//     private boolean isSpace(Character c) {
//         return c != null && (c == ' ' || c == '\t');
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/accessor/Accessor.java
// public class Accessor<T> {
// 
//     private final Map<String, Integer> fieldMap;
//     private final Integer leastCapacity;
// 
//     public Accessor(String[] fields) {
//         Pair<Map<String, Integer>, Integer> fieldMapPair = Lexer.buildFieldMapPair(fields);
//         fieldMap = fieldMapPair.getFirst();
//         leastCapacity = fieldMapPair.getSecond();
//     }
// 
//     public Map<String, Integer> getFieldMap() {
//         return fieldMap;
//     }
// 
//     public Integer getLeastCapacity() {
//         return leastCapacity;
//     }
// 
//     public RecordWrapper<T> create(Accessible<T> record) {
//         assertTrue (record.size() >= leastCapacity);
// 
//         return new RecordWrapper<>(fieldMap, record);
//     }
// 
//     public RecordWrapper<T> of(Accessible<T> record) {
//         return create(record);
//     }
// }
// 
// 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/impl/CSVSource.java
import net.kimleo.rec.common.concept.Mapped;
import net.kimleo.rec.sepval.parser.ParseConfig;
import net.kimleo.rec.sepval.parser.SimpleParser;
import net.kimleo.rec.v2.accessor.Accessor;
import net.kimleo.rec.v2.model.Source;
import java.io.BufferedReader;
import java.io.Reader;
import java.util.stream.Stream;

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



public class CSVSource implements Source<Mapped<String>> {

    private final BufferedReader reader;
    private final Accessor<String> accessor;
    private final SimpleParser csvParser;