package com.github.davidmoten.rx; import java.io.Closeable; import java.io.IOException; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import rx.Subscription; import rx.functions.Action0; import rx.functions.Action1; import rx.functions.Action2; import rx.functions.Action3; public final class Actions { private Actions() { // prevent instantiation } public static Action1<Integer> setAtomic(final AtomicInteger a) { return new Action1<Integer>() { @Override public void call(Integer t) { a.set(t); } }; } public static Action1<Long> setAtomic(final AtomicLong a) { return new Action1<Long>() { @Override public void call(Long t) { a.set(t); } }; } public static Action1<Boolean> setAtomic(final AtomicBoolean a) { return new Action1<Boolean>() { @Override public void call(Boolean t) { a.set(t); } }; } public static <T> Action1<T> setAtomic(final AtomicReference<T> a) { return new Action1<T>() { @Override public void call(T t) { a.set(t); } }; } private static class HolderDoNothing0 { static final Action0 INSTANCE = new Action0() { @Override public void call() { // do nothing } }; } public static Action0 doNothing0() { return HolderDoNothing0.INSTANCE; } private static class HolderDoNothing1 { static final Action1<Object> INSTANCE = new Action1<Object>() { @Override public void call(Object t) { // do Nothing } }; } @SuppressWarnings("unchecked") public static <T> Action1<T> doNothing1() { return (Action1<T>) HolderDoNothing1.INSTANCE; } private static class HolderDoNothing2 { static final Action2<Object, Object> INSTANCE = new Action2<Object, Object>() { @Override public void call(Object t, Object t2) { // do Nothing } }; } @SuppressWarnings("unchecked") public static <T, R> Action2<T, R> doNothing2() { return (Action2<T, R>) HolderDoNothing2.INSTANCE; } private static class HolderDoNothing3 { static final Action3<Object, Object, Object> INSTANCE = new Action3<Object, Object, Object>() { @Override public void call(Object t, Object t2, Object t3) { // do Nothing } }; } @SuppressWarnings("unchecked") public static <T, R, S> Action3<T, R, S> doNothing3() { return (Action3<T, R, S>) HolderDoNothing3.INSTANCE; } public static Action0 unsubscribe(final Subscription subscription) { return new Action0() { @Override public void call() { subscription.unsubscribe(); } }; } public static <T> Action1<T> increment1(final AtomicInteger count) { return new Action1<T>() { @Override public void call(T t) { count.incrementAndGet(); } }; } public static Action0 increment0(final AtomicInteger count) { return new Action0() { @Override public void call() { count.incrementAndGet(); } }; } public static <T> Action1<T> decrement1(final AtomicInteger count) { return new Action1<T>() { @Override public void call(T t) { count.incrementAndGet(); } }; } public static Action0 decrement0(final AtomicInteger count) { return new Action0() { @Override public void call() { count.incrementAndGet(); } }; } public static Action1<Long> addTo(final AtomicLong value) { return new Action1<Long>() { @Override public void call(Long t) { value.addAndGet(t); } }; } @SuppressWarnings("unchecked") public static <T> Action1<T> println() { return (Action1<T>) PrintlnHolder.instance; } private static class PrintlnHolder { static final Action1<Object> instance = new Action1<Object>() { @Override public void call(Object t) { System.out.println(t); } }; } public static <T> Action1<T> setToTrue1(final AtomicBoolean ref) { return new Action1<T>() { @Override public void call(T t) { ref.set(true); } }; } public static Action0 setToTrue0(final AtomicBoolean ref) { return new Action0() { @Override public void call() { ref.set(true); } }; } public static Action0 countDown(final CountDownLatch latch) { return new Action0() { @Override public void call() { latch.countDown(); } }; } public static <T> Action1<T> countDown1(final CountDownLatch latch) { return new Action1<T>() { @Override public void call(T t) { latch.countDown(); } }; } public static Action1<Throwable> printStackTrace1() { return PrintStackTrace1Holder.instance; } private static class PrintStackTrace1Holder { static final Action1<Throwable> instance = new Action1<Throwable>() { @Override public void call(Throwable t) { t.printStackTrace(); } }; } public static Action0 throw0(final RuntimeException ex) { return new Action0() { @Override public void call() { throw ex; } }; } public static Action1<Closeable> close() { return CloseHolder.INSTANCE; } private static final class CloseHolder { final static Action1<Closeable> INSTANCE = new Action1<Closeable>() { @Override public void call(Closeable c) { try { c.close(); } catch (IOException e) { throw new RuntimeException(e); } } }; } public static <T> Action1<T> addTo(final List<T> list) { return new Action1<T>() { @Override public void call(T t) { list.add(t); } }; } }