// Path: src/main/java/com/timgroup/karg/reference/Cell.java
// public final class Cell<T> implements Ref<T> {
// 
//     public static <T> Updatable<T> of(final T value) {
//         return ConcurrentRef.to(new Cell<T>(value));
//     }
//     
//     private T value;
//     
//     private Cell(T value) {
//         this.value = value;
//     }
// 
//     @Override
//     public T get() {
//         return value;
//     }
// 
//     @Override
//     public T set(T newValue) {
//         value = newValue;
//         return newValue;
//     }
// }
// 
// Path: src/main/java/com/timgroup/karg/reference/Ref.java
// public interface Ref<T> extends Gettable<T>, Settable<T> { }
// 
// Path: src/main/java/com/timgroup/karg/reference/Refs.java
// public final class Refs {
//     
//     public static <T> Iterable<T> toIterable(final Ref<T> ref) {
//         return new Iterable<T>() {
//             @Override public Iterator<T> iterator() {
//                 return new Iterator<T>() {
//                     private boolean consumed = ref.get() == null;
//                     @Override public boolean hasNext() {
//                         return !consumed;
//                     }
//     
//                     @Override public T next() {
//                         if (consumed) {
//                             return null;
//                         }
//                         consumed = true;
//                         return ref.get();
//                     }
//     
//                     @Override public void remove() {
//                         ref.set(null);
//                     }
//                 };
//             }
//         };
//     }
//     
//     public static <T> Function<Ref<T>, Iterable<T>> toIterable() {
//         return new Function<Ref<T>, Iterable<T>>() {
//             @Override public Iterable<T> apply(Ref<T> arg0) {
//                 return toIterable(arg0);
//             }
//         };
//     }
//     
//     public static <T> Iterable<T> toIterable(Iterable<? extends Ref<T>> refs) {
//         Function<Ref<T>, Iterable<T>> toIterable = toIterable();
//         return Iterables.concat(Iterables.transform(refs, toIterable));
//     }
//     
//     private Refs() {  }
//     
// }


import org.junit.Test;
import com.google.common.collect.Lists;
import com.timgroup.karg.reference.Cell;
import com.timgroup.karg.reference.Ref;
import com.timgroup.karg.reference.Refs;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.is;
package com.timgroup.karg.reference;





public class RefsTest {

    @Test public void
    anyRefCanBeAnIterable() {
        Iterable<String> iterable = Refs.toIterable(Cell.of("Hello"));
        assertThat(iterable.iterator().hasNext(), is(true));
        assertThat(iterable.iterator().next(), is("Hello"));
    }
    
    @Test public void
    anEmptyRefIsAnEmptyIterable() {
// Path: src/main/java/com/timgroup/karg/reference/Cell.java
// public final class Cell<T> implements Ref<T> {
// 
//     public static <T> Updatable<T> of(final T value) {
//         return ConcurrentRef.to(new Cell<T>(value));
//     }
//     
//     private T value;
//     
//     private Cell(T value) {
//         this.value = value;
//     }
// 
//     @Override
//     public T get() {
//         return value;
//     }
// 
//     @Override
//     public T set(T newValue) {
//         value = newValue;
//         return newValue;
//     }
// }
// 
// Path: src/main/java/com/timgroup/karg/reference/Ref.java
// public interface Ref<T> extends Gettable<T>, Settable<T> { }
// 
// Path: src/main/java/com/timgroup/karg/reference/Refs.java
// public final class Refs {
//     
//     public static <T> Iterable<T> toIterable(final Ref<T> ref) {
//         return new Iterable<T>() {
//             @Override public Iterator<T> iterator() {
//                 return new Iterator<T>() {
//                     private boolean consumed = ref.get() == null;
//                     @Override public boolean hasNext() {
//                         return !consumed;
//                     }
//     
//                     @Override public T next() {
//                         if (consumed) {
//                             return null;
//                         }
//                         consumed = true;
//                         return ref.get();
//                     }
//     
//                     @Override public void remove() {
//                         ref.set(null);
//                     }
//                 };
//             }
//         };
//     }
//     
//     public static <T> Function<Ref<T>, Iterable<T>> toIterable() {
//         return new Function<Ref<T>, Iterable<T>>() {
//             @Override public Iterable<T> apply(Ref<T> arg0) {
//                 return toIterable(arg0);
//             }
//         };
//     }
//     
//     public static <T> Iterable<T> toIterable(Iterable<? extends Ref<T>> refs) {
//         Function<Ref<T>, Iterable<T>> toIterable = toIterable();
//         return Iterables.concat(Iterables.transform(refs, toIterable));
//     }
//     
//     private Refs() {  }
//     
// }


// Path: src/test/java/com/timgroup/karg/reference/RefsTest.java
import org.junit.Test;
import com.google.common.collect.Lists;
import com.timgroup.karg.reference.Cell;
import com.timgroup.karg.reference.Ref;
import com.timgroup.karg.reference.Refs;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.is;

package com.timgroup.karg.reference;





public class RefsTest {

    @Test public void
    anyRefCanBeAnIterable() {
        Iterable<String> iterable = Refs.toIterable(Cell.of("Hello"));
        assertThat(iterable.iterator().hasNext(), is(true));
        assertThat(iterable.iterator().next(), is("Hello"));
    }
    
    @Test public void
    anEmptyRefIsAnEmptyIterable() {
        Ref<String> ref = Cell.of(null);