// Path: src/main/java/javafixes/object/changing/ChangingValue.java
// static <T1, T2> DerivedValue<Tuple<T1, T2>, ?> join(ChangingValue<T1> value1, ChangingValue<T2> value2) {
//     return ((ChangingValue<List<Object>>) new DerivedMultiValue(newList(value1, value2)))
//             .map(values -> tuple(
//                     (T1) values.get(0),
//                     (T2) values.get(1)
//             ));
// }
// 
// Path: src/main/java/javafixes/object/changing/MutableValue.java
// public static <T> MutableValue<T> mutableValue(T initialValue) {
//     return new MutableValue<>(
//             Optional.empty(),
//             right(initialValue),
//             Optional.empty(),
//             Optional.empty());
// }
// 
// Path: src/test/java/javafixes/test/Random.java
// public static boolean randomBoolean() {
//     return pickRandomValue(true, false);
// }


import org.junit.Test;
import static javafixes.object.changing.ChangingValue.join;
import static javafixes.object.changing.MutableValue.mutableValue;
import static javafixes.test.Random.randomBoolean;
package javafixes.object.changing;



public class ChangingValueTest {


    @Test
    public void shouldBeAbleToUseIt() {

        MutableValue<String> hostAndPort = mutableValue("host123:8080")
                .withOnValueChangedFunction(
                        value -> System.out.println("host = " + value),
                        true
                );
        ChangingValue<Boolean> isConnected = hostAndPort.map(value -> randomBoolean())
                .withOnValueChangedFunction(
                        value -> System.out.println("is connected = " + value),
                        true
                );

// Path: src/main/java/javafixes/object/changing/ChangingValue.java
// static <T1, T2> DerivedValue<Tuple<T1, T2>, ?> join(ChangingValue<T1> value1, ChangingValue<T2> value2) {
//     return ((ChangingValue<List<Object>>) new DerivedMultiValue(newList(value1, value2)))
//             .map(values -> tuple(
//                     (T1) values.get(0),
//                     (T2) values.get(1)
//             ));
// }
// 
// Path: src/main/java/javafixes/object/changing/MutableValue.java
// public static <T> MutableValue<T> mutableValue(T initialValue) {
//     return new MutableValue<>(
//             Optional.empty(),
//             right(initialValue),
//             Optional.empty(),
//             Optional.empty());
// }
// 
// Path: src/test/java/javafixes/test/Random.java
// public static boolean randomBoolean() {
//     return pickRandomValue(true, false);
// }


// Path: src/test/java/javafixes/object/changing/ChangingValueTest.java
import org.junit.Test;
import static javafixes.object.changing.ChangingValue.join;
import static javafixes.object.changing.MutableValue.mutableValue;
import static javafixes.test.Random.randomBoolean;

package javafixes.object.changing;



public class ChangingValueTest {


    @Test
    public void shouldBeAbleToUseIt() {

        MutableValue<String> hostAndPort = mutableValue("host123:8080")
                .withOnValueChangedFunction(
                        value -> System.out.println("host = " + value),
                        true
                );
        ChangingValue<Boolean> isConnected = hostAndPort.map(value -> randomBoolean())
                .withOnValueChangedFunction(
                        value -> System.out.println("is connected = " + value),
                        true
                );

        ChangingValue<String> nodeInfo = join(hostAndPort, isConnected).map(tuple -> {