// 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/common/exception/ResourceAccessException.java
// public class ResourceAccessException extends RuntimeException {
//     public ResourceAccessException(String message, Throwable ex) {
//         super(message, ex);
//     }
// }
// 
// 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/Target.java
// public interface Target<T> {
//     void put(T record);
// 
//     default Target<T> tee(Tee<T> tee) {
//         return record -> this.put(tee.emit(record));
//     }
// 
//     default void putAll(Source<T> source) {
//         source.stream().forEach(this::put);
//     }
// 
// }


import net.kimleo.rec.common.concept.Mapped;
import net.kimleo.rec.common.exception.ResourceAccessException;
import net.kimleo.rec.v2.model.Source;
import net.kimleo.rec.v2.model.Target;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.util.stream.Collectors;
package net.kimleo.rec.v2.model.impl;



public class FlatFileTarget implements Target<Mapped<String>>, Closeable {

    private final PrintWriter writer;

    public FlatFileTarget(File file) {
        try {
            writer = new PrintWriter(Files.newBufferedWriter(file.toPath()));
        } catch (IOException e) {
            throw new ResourceAccessException(String.format("Cannot open output file: [%s]", file.getName()), e);
        }

    }

    @Override
    public void put(Mapped<String> record) {
        writer.println(record.keys().stream().map(record::get).collect(Collectors.joining(", ")));
    }

    @Override
// 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/common/exception/ResourceAccessException.java
// public class ResourceAccessException extends RuntimeException {
//     public ResourceAccessException(String message, Throwable ex) {
//         super(message, ex);
//     }
// }
// 
// 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/Target.java
// public interface Target<T> {
//     void put(T record);
// 
//     default Target<T> tee(Tee<T> tee) {
//         return record -> this.put(tee.emit(record));
//     }
// 
//     default void putAll(Source<T> source) {
//         source.stream().forEach(this::put);
//     }
// 
// }


// Path: src/main/java/net/kimleo/rec/v2/model/impl/FlatFileTarget.java
import net.kimleo.rec.common.concept.Mapped;
import net.kimleo.rec.common.exception.ResourceAccessException;
import net.kimleo.rec.v2.model.Source;
import net.kimleo.rec.v2.model.Target;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.util.stream.Collectors;

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



public class FlatFileTarget implements Target<Mapped<String>>, Closeable {

    private final PrintWriter writer;

    public FlatFileTarget(File file) {
        try {
            writer = new PrintWriter(Files.newBufferedWriter(file.toPath()));
        } catch (IOException e) {
            throw new ResourceAccessException(String.format("Cannot open output file: [%s]", file.getName()), e);
        }

    }

    @Override
    public void put(Mapped<String> record) {
        writer.println(record.keys().stream().map(record::get).collect(Collectors.joining(", ")));
    }

    @Override
    public void putAll(Source<Mapped<String>> source) {