/***************************************************************************** * Copyright (C) Codehaus.org * * ------------------------------------------------------------------------- * * 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 net.ion.rosetta; import net.ion.rosetta.functors.Map; import net.ion.rosetta.functors.Map2; import net.ion.rosetta.functors.Map3; import net.ion.rosetta.functors.Map4; import net.ion.rosetta.functors.Map5; /** * Functors used only internally by this package. * * @author Ben Yu */ final class InternalFunctors { static <T> TokenMap<T> isTokenType(final Class<T> targetType, final String name) { return new TokenMap<T>() { public T map(Token token) { if (targetType.isInstance(token.value())) { return targetType.cast(token.value()); } return null; } @Override public String toString() { return name; } }; } static TokenMap<Token> tokenWithSameValue(final Object value) { return new TokenMap<Token>() { public Token map(Token token) { return (value == token.value()) ? token : null; } @Override public String toString() { return String.valueOf(value); } }; } @SuppressWarnings("unchecked") private static final Map2 FIRST_OF_TWO = new Map2() { public Object map(Object first, Object b) { return first; } @Override public String toString() { return "followedBy"; } }; @SuppressWarnings("unchecked") private static final Map2 LAST_OF_TWO = new Map2() { public Object map(Object a, Object last) { return last; } @Override public String toString() { return "sequence"; } }; @SuppressWarnings("unchecked") private static final Map3 LAST_OF_THREE = new Map3() { public Object map(Object a, Object b, Object last) { return last; } @Override public String toString() { return "sequence"; } }; @SuppressWarnings("unchecked") private static final Map4 LAST_OF_FOUR = new Map4() { public Object map(Object a, Object b, Object c, Object last) { return last; } @Override public String toString() { return "sequence"; } }; @SuppressWarnings("unchecked") private static final Map5 LAST_OF_FIVE = new Map5() { public Object map(Object a, Object b, Object c, Object d, Object last) { return last; } @Override public String toString() { return "sequence"; } }; @SuppressWarnings("unchecked") static <T, B> Map2<T, B, T> firstOfTwo() { return FIRST_OF_TWO; } @SuppressWarnings("unchecked") static <A, T> Map2<A, T, T> lastOfTwo() { return LAST_OF_TWO; } @SuppressWarnings("unchecked") static <A, B, T> Map3<A, B, T, T> lastOfThree() { return LAST_OF_THREE; } @SuppressWarnings("unchecked") static <A, B, C, T> Map4<A, B, C, T, T> lastOfFour() { return LAST_OF_FOUR; } @SuppressWarnings("unchecked") static <A, B, C, D, T> Map5<A, B, C, D, T, T> lastOfFive() { return LAST_OF_FIVE; } /** * Returns a {@link Map} that delegates to {@code map} and falls back to {@code defaultMap} for null return values. */ public static <F, T> Map<F, T> fallback(final Map<F, T> map, final Map<? super F, ? extends T> defaultMap) { return new Map<F, T>() { public T map(F v) { T result = map.map(v); return (result == null) ? defaultMap.map(v) : result; } @Override public String toString() { return "fallback"; } }; } }