public <T1> Mutable<T1> mapInput(final Function<T1, T> fn) { final Mutable<T> host = this; return new Mutable<T1>() { @Override public Mutable<T1> set(final T1 value) { host.set(fn.apply(value)); return this; } }; }
public <R> Mutable<R> mapOutput(final Function<T, R> fn) { final Mutable<T> host = this; return new Mutable<R>() { @Override public R get() { return fn.apply(host.get()); } }; }
/** * Create a Mutable variable, which can be mutated inside a Closure * * e.g. * <pre>{@code * Mutable<Integer> num = Mutable.of(20); * * Stream.of(1,2,3,4).map(i->i*10).peek(i-> num.mutate(n->n+i)).foreach(System.out::println); * * System.out.println(num.getValue()); * //prints 120 * } </pre> * * @param var Initial value of Mutable * @return New Mutable instance */ public static <T> Mutable<T> of(final T var) { return new Mutable<T>( var); }
/** * Construct a Mutable that gets and sets an external value using the provided Supplier and Consumer * * e.g. * <pre> * {@code * Mutable<Integer> mutable = Mutable.from(()->this.value*2,val->this.value=val); * } * </pre> * * * @param s Supplier of an external value * @param c Consumer that sets an external value * @return Mutable that gets / sets an external (mutable) value */ public static <T> Mutable<T> fromExternal(final Supplier<T> s, final Consumer<T> c) { return new Mutable<T>() { @Override public T get() { return s.get(); } @Override public Mutable<T> set(final T value) { c.accept(value); return this; } }; }
@Test public void inClosure(){ Mutable<Integer> myInt = new Mutable<>(0); Function<Integer,Function<Integer,Mutable<Integer>>> fn = ((Integer i)-> (Integer j)-> myInt.set(i*j)); fn.apply(10).apply(20); assertThat(myInt.get(), is(200)); } @Test
@Test public void testClosedVar() { assertThat(new Mutable(10).get(),equalTo(10)); } @Test
@Test public void inClosure2(){ Mutable<Integer> myInt = new Mutable<>(0); BiFunction<Integer,Integer,Mutable<Integer>> fn = (i,j)-> myInt.set(i*j); fn.apply(10,20); assertThat(myInt.get(), is(200)); }
@Test public void testSet() { assertThat(new Mutable().set("hello").get(),is("hello")); }
public <R> Mutable<R> mapOutput(final Function<T, R> fn) { final Mutable<T> host = this; return new Mutable<R>() { @Override public R get() { return fn.apply(host.get()); } }; }
public <T1> Mutable<T1> mapInput(final Function<T1, T> fn) { final Mutable<T> host = this; return new Mutable<T1>() { @Override public Mutable<T1> set(final T1 value) { host.set(fn.apply(value)); return this; } }; }
/** * Create a Mutable variable, which can be mutated inside a Closure * * e.g. * <pre>{@code * Mutable<Integer> num = Mutable.of(20); * * Stream.of(1,2,3,4).map(i->i*10).peek(i-> num.mutate(n->n+i)).foreach(System.out::println); * * System.out.println(num.getValue()); * //prints 120 * } </pre> * * @param var Initial value of Mutable * @return New Mutable instance */ public static <T> Mutable<T> of(final T var) { return new Mutable<T>( var); }
/** * Construct a Mutable that gets and sets an external value using the provided Supplier and Consumer * * e.g. * <pre> * {@code * Mutable<Integer> mutable = Mutable.from(()->this.value*2,val->this.value=val); * } * </pre> * * * @param s Supplier of an external value * @param c Consumer that sets an external value * @return Mutable that gets / sets an external (mutable) value */ public static <T> Mutable<T> fromExternal(final Supplier<T> s, final Consumer<T> c) { return new Mutable<T>() { @Override public T get() { return s.get(); } @Override public Mutable<T> set(final T value) { c.accept(value); return this; } }; }