/** * Copyright 2014 Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package rx.functions; import rx.exceptions.OnErrorNotImplementedException; /** * Utility class for the Action interfaces. */ public final class Actions { @SuppressWarnings("rawtypes") private static final EmptyAction EMPTY_ACTION = new EmptyAction(); private Actions() { throw new IllegalStateException("No instances!"); } @SuppressWarnings("unchecked") public static EmptyAction empty() { return EMPTY_ACTION; } static final class EmptyAction implements Action0, Action1, Action2, Action3, Action4, Action5, Action6, Action7, Action8, Action9, ActionN { @Override public void call() { // deliberately no op } @Override public void call(T0 t1) { // deliberately no op } @Override public void call(T0 t1, T1 t2) { // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3) { // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4) { // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5) { // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5, T5 t6) { // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5, T5 t6, T6 t7) { // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5, T5 t6, T6 t7, T7 t8) { // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5, T5 t6, T6 t7, T7 t8, T8 t9) { // deliberately no op } @Override public void call(Object... args) { // deliberately no op } } /** * Converts an {@link Action0} to a function that calls the action and returns {@code null}. * * @param action * the {@link Action0} to convert * @return a {@link Func0} that calls {@code action} and returns {@code null} */ public static Func0 toFunc(final Action0 action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action1} to a function that calls the action and returns {@code null}. * * @param the first argument type * @param action * the {@link Action1} to convert * @return a {@link Func1} that calls {@code action} and returns {@code null} */ public static Func1 toFunc(final Action1 action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action2} to a function that calls the action and returns {@code null}. * * @param the first argument type * @param the second argument type * @param action * the {@link Action2} to convert * @return a {@link Func2} that calls {@code action} and returns {@code null} */ public static Func2 toFunc(final Action2 action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action3} to a function that calls the action and returns {@code null}. * * @param the first argument type * @param the second argument type * @param the third argument type * @param action * the {@link Action3} to convert * @return a {@link Func3} that calls {@code action} and returns {@code null} */ public static Func3 toFunc(final Action3 action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action4} to a function that calls the action and returns {@code null}. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param action * the {@link Action4} to convert * @return a {@link Func4} that calls {@code action} and returns {@code null} */ public static Func4 toFunc(final Action4 action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action5} to a function that calls the action and returns {@code null}. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param action * the {@link Action5} to convert * @return a {@link Func5} that calls {@code action} and returns {@code null} */ public static Func5 toFunc( final Action5 action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action6} to a function that calls the action and returns {@code null}. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param the sixth argument type * @param action * the {@link Action6} to convert * @return a {@link Func6} that calls {@code action} and returns {@code null} */ public static Func6 toFunc( final Action6 action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action7} to a function that calls the action and returns {@code null}. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param the sixth argument type * @param the seventh argument type * @param action * the {@link Action7} to convert * @return a {@link Func7} that calls {@code action} and returns {@code null} */ public static Func7 toFunc( final Action7 action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action8} to a function that calls the action and returns {@code null}. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param the sixth argument type * @param the seventh argument type * @param the eighth argument type * @param action * the {@link Action8} to convert * @return a {@link Func8} that calls {@code action} and returns {@code null} */ public static Func8 toFunc( final Action8 action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action9} to a function that calls the action and returns {@code null}. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param the sixth argument type * @param the seventh argument type * @param the eighth argument type * @param the ninth argument type * @param action * the {@link Action9} to convert * @return a {@link Func9} that calls {@code action} and returns {@code null} */ public static Func9 toFunc( final Action9 action) { return toFunc(action, (Void) null); } /** * Converts an {@link ActionN} to a function that calls the action and returns {@code null}. * * @param action * the {@link ActionN} to convert * @return a {@link FuncN} that calls {@code action} and returns {@code null} */ public static FuncN toFunc( final ActionN action) { return toFunc(action, (Void) null); } /** * Converts an {@link Action0} to a function that calls the action and returns a specified value. * * @param the result type * @param action * the {@link Action0} to convert * @param result * the value to return from the function call * @return a {@link Func0} that calls {@code action} and returns {@code result} */ public static Func0 toFunc(final Action0 action, final R result) { return new Func0() { @Override public R call() { action.call(); return result; } }; } /** * Converts an {@link Action1} to a function that calls the action and returns a specified value. * * @param the first argument type * @param the result type * @param action * the {@link Action1} to convert * @param result * the value to return from the function call * @return a {@link Func1} that calls {@code action} and returns {@code result} */ public static Func1 toFunc(final Action1 action, final R result) { return new Func1() { @Override public R call(T1 t1) { action.call(t1); return result; } }; } /** * Converts an {@link Action2} to a function that calls the action and returns a specified value. * * @param the first argument type * @param the second argument type * @param the result type * @param action * the {@link Action2} to convert * @param result * the value to return from the function call * @return a {@link Func2} that calls {@code action} and returns {@code result} */ public static Func2 toFunc(final Action2 action, final R result) { return new Func2() { @Override public R call(T1 t1, T2 t2) { action.call(t1, t2); return result; } }; } /** * Converts an {@link Action3} to a function that calls the action and returns a specified value. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the result type * @param action * the {@link Action3} to convert * @param result * the value to return from the function call * @return a {@link Func3} that calls {@code action} and returns {@code result} */ public static Func3 toFunc(final Action3 action, final R result) { return new Func3() { @Override public R call(T1 t1, T2 t2, T3 t3) { action.call(t1, t2, t3); return result; } }; } /** * Converts an {@link Action4} to a function that calls the action and returns a specified value. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the result type * @param action * the {@link Action4} to convert * @param result * the value to return from the function call * @return a {@link Func4} that calls {@code action} and returns {@code result} */ public static Func4 toFunc(final Action4 action, final R result) { return new Func4() { @Override public R call(T1 t1, T2 t2, T3 t3, T4 t4) { action.call(t1, t2, t3, t4); return result; } }; } /** * Converts an {@link Action5} to a function that calls the action and returns a specified value. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param the result type * @param action * the {@link Action5} to convert * @param result * the value to return from the function call * @return a {@link Func5} that calls {@code action} and returns {@code result} */ public static Func5 toFunc( final Action5 action, final R result) { return new Func5() { @Override public R call(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) { action.call(t1, t2, t3, t4, t5); return result; } }; } /** * Converts an {@link Action6} to a function that calls the action and returns a specified value. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param the sixth argument type * @param the result type * @param action * the {@link Action6} to convert * @param result * the value to return from the function call * @return a {@link Func6} that calls {@code action} and returns {@code result} */ public static Func6 toFunc( final Action6 action, final R result) { return new Func6() { @Override public R call(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) { action.call(t1, t2, t3, t4, t5, t6); return result; } }; } /** * Converts an {@link Action7} to a function that calls the action and returns a specified value. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param the sixth argument type * @param the seventh argument type * @param the result type * @param action * the {@link Action7} to convert * @param result * the value to return from the function call * @return a {@link Func7} that calls {@code action} and returns {@code result} */ public static Func7 toFunc( final Action7 action, final R result) { return new Func7() { @Override public R call(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) { action.call(t1, t2, t3, t4, t5, t6, t7); return result; } }; } /** * Converts an {@link Action8} to a function that calls the action and returns a specified value. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param the sixth argument type * @param the seventh argument type * @param the eighth argument type * @param the result type * @param action * the {@link Action8} to convert * @param result * the value to return from the function call * @return a {@link Func8} that calls {@code action} and returns {@code result} */ public static Func8 toFunc( final Action8 action, final R result) { return new Func8() { @Override public R call(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) { action.call(t1, t2, t3, t4, t5, t6, t7, t8); return result; } }; } /** * Converts an {@link Action9} to a function that calls the action and returns a specified value. * * @param the first argument type * @param the second argument type * @param the third argument type * @param the fourth argument type * @param the fifth argument type * @param the sixth argument type * @param the seventh argument type * @param the eighth argument type * @param the ninth argument type * @param the result type * @param action * the {@link Action9} to convert * @param result * the value to return from the function call * @return a {@link Func9} that calls {@code action} and returns {@code result} */ public static Func9 toFunc( final Action9 action, final R result) { return new Func9() { @Override public R call(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9) { action.call(t1, t2, t3, t4, t5, t6, t7, t8, t9); return result; } }; } /** * Converts an {@link ActionN} to a function that calls the action and returns a specified value. * * @param the result type * @param action * the {@link ActionN} to convert * @param result * the value to return from the function call * @return a {@link FuncN} that calls {@code action} and returns {@code result} */ public static FuncN toFunc( final ActionN action, final R result) { return new FuncN() { @Override public R call(Object... args) { action.call(args); return result; } }; } /** * Wraps an Action0 instance into an Action1 instance where the latter calls * the former. * @param the first argument type * @param action the action to call * @return the new Action1 instance */ public static Action1 toAction1(Action0 action) { return new Action1CallsAction0(action); } static final class Action1CallsAction0 implements Action1 { final Action0 action; public Action1CallsAction0(Action0 action) { this.action = action; } @Override public void call(T t) { action.call(); } } enum NotImplemented implements Action1 { INSTANCE; @Override public void call(Throwable t) { throw new OnErrorNotImplementedException(t); } } /** * Returns an action which throws OnErrorNotImplementedException. * @return the the shared action */ public static Action1 errorNotImplemented() { return NotImplemented.INSTANCE; } }