// Path: src/main/java/ca/rbon/iostream/wrap/BufferedReaderOf.java
// public class BufferedReaderOf<T> extends BufferedReader implements WrapperOf<T> {
// 
//     final Resource<T> closer;
// 
//     /**
//      * <p>
//      * Constructor for BufferedReaderOf.
//      * </p>
//      *
//      * @param cl a {@link ca.rbon.iostream.resource.Resource} object.
//      * @param r  a {@link java.io.Reader} object.
//      */
//     public BufferedReaderOf(Resource<T> cl, Reader r) {
//         super(r);
//         closer = cl;
//     }
// 
//     /** {@inheritDoc} */
//     @Override
//     public T getInner() throws IOException {
//         return closer.getResource();
//     }
// 
//     /**
//      * Use the BufferedReader inline and return the inner resource.
//      * @param operation The operation to apply.
//      * @return The inner resource.
//      * @throws IOException if the passed in closure throws
//      */
//     public T with(BiConsumer<BufferedReaderOf<T>, T> operation) throws IOException {
//         operation.accept(this, getInner());
//         return getInner();
//     }
// }
// 
// Path: src/main/java/ca/rbon/iostream/wrap/ReaderOf.java
// public class ReaderOf<T> extends Reader implements WrapperOf<T> {
// 
//     final Reader delegate;
// 
//     final Resource<T> closer;
// 
//     /**
//      * <p>
//      * Constructor for ReaderOf.
//      * </p>
//      *
//      * @param cl a {@link ca.rbon.iostream.resource.Resource} object.
//      * @param os a {@link java.io.Reader} object.
//      */
//     public ReaderOf(Resource<T> cl, Reader os) {
//         delegate = os;
//         closer = cl;
//     }
// 
//     /** {@inheritDoc} */
//     @Override
//     public void close() throws IOException {
//         delegate.close();
//     }
// 
//     /** {@inheritDoc} */
//     @Override
//     public T getInner() throws IOException {
//         return closer.getResource();
//     }
// 
//     /** {@inheritDoc} */
//     @Override
//     public int read(char[] cbuf, int off, int len) throws IOException {
//         return delegate.read(cbuf, off, len);
//     }
// 
//     /**
//      * Use the Reader inline and return the inner resource.
//      * @param operation The operation to apply.
//      * @return The inner resource.
//      * @throws IOException if the passed in closure throws
//      */
//     public T with(BiConsumer<ReaderOf<T>, T> operation) throws IOException {
//         operation.accept(this, getInner());
//         return getInner();
//     }
// 
// }


import java.io.IOException;
import ca.rbon.iostream.wrap.BufferedReaderOf;
import ca.rbon.iostream.wrap.ReaderOf;
package ca.rbon.iostream.channel.part;



public interface CharIn<T> {

    ReaderOf<T> reader() throws IOException;

    BufferedReaderOf<T> bufferedReader(int bufferSize) throws IOException;

// Path: src/main/java/ca/rbon/iostream/wrap/BufferedReaderOf.java
// public class BufferedReaderOf<T> extends BufferedReader implements WrapperOf<T> {
// 
//     final Resource<T> closer;
// 
//     /**
//      * <p>
//      * Constructor for BufferedReaderOf.
//      * </p>
//      *
//      * @param cl a {@link ca.rbon.iostream.resource.Resource} object.
//      * @param r  a {@link java.io.Reader} object.
//      */
//     public BufferedReaderOf(Resource<T> cl, Reader r) {
//         super(r);
//         closer = cl;
//     }
// 
//     /** {@inheritDoc} */
//     @Override
//     public T getInner() throws IOException {
//         return closer.getResource();
//     }
// 
//     /**
//      * Use the BufferedReader inline and return the inner resource.
//      * @param operation The operation to apply.
//      * @return The inner resource.
//      * @throws IOException if the passed in closure throws
//      */
//     public T with(BiConsumer<BufferedReaderOf<T>, T> operation) throws IOException {
//         operation.accept(this, getInner());
//         return getInner();
//     }
// }
// 
// Path: src/main/java/ca/rbon/iostream/wrap/ReaderOf.java
// public class ReaderOf<T> extends Reader implements WrapperOf<T> {
// 
//     final Reader delegate;
// 
//     final Resource<T> closer;
// 
//     /**
//      * <p>
//      * Constructor for ReaderOf.
//      * </p>
//      *
//      * @param cl a {@link ca.rbon.iostream.resource.Resource} object.
//      * @param os a {@link java.io.Reader} object.
//      */
//     public ReaderOf(Resource<T> cl, Reader os) {
//         delegate = os;
//         closer = cl;
//     }
// 
//     /** {@inheritDoc} */
//     @Override
//     public void close() throws IOException {
//         delegate.close();
//     }
// 
//     /** {@inheritDoc} */
//     @Override
//     public T getInner() throws IOException {
//         return closer.getResource();
//     }
// 
//     /** {@inheritDoc} */
//     @Override
//     public int read(char[] cbuf, int off, int len) throws IOException {
//         return delegate.read(cbuf, off, len);
//     }
// 
//     /**
//      * Use the Reader inline and return the inner resource.
//      * @param operation The operation to apply.
//      * @return The inner resource.
//      * @throws IOException if the passed in closure throws
//      */
//     public T with(BiConsumer<ReaderOf<T>, T> operation) throws IOException {
//         operation.accept(this, getInner());
//         return getInner();
//     }
// 
// }


// Path: src/main/java/ca/rbon/iostream/channel/part/CharIn.java
import java.io.IOException;
import ca.rbon.iostream.wrap.BufferedReaderOf;
import ca.rbon.iostream.wrap.ReaderOf;

package ca.rbon.iostream.channel.part;



public interface CharIn<T> {

    ReaderOf<T> reader() throws IOException;

    BufferedReaderOf<T> bufferedReader(int bufferSize) throws IOException;

    BufferedReaderOf<T> bufferedReader() throws IOException;