001package conexp.fx.core.math;
002
003/*
004 * #%L
005 * Concept Explorer FX
006 * %%
007 * Copyright (C) 2010 - 2023 Francesco Kriegel
008 * %%
009 * This program is free software: you can redistribute it and/or modify
010 * it under the terms of the GNU General Public License as
011 * published by the Free Software Foundation, either version 3 of the
012 * License, or (at your option) any later version.
013 * 
014 * This program is distributed in the hope that it will be useful,
015 * but WITHOUT ANY WARRANTY; without even the implied warranty of
016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
017 * GNU General Public License for more details.
018 * 
019 * You should have received a copy of the GNU General Public
020 * License along with this program.  If not, see
021 * <http://www.gnu.org/licenses/gpl-3.0.html>.
022 * #L%
023 */
024
025import java.util.function.Function;
026
027public final class Isomorphism<T, R> implements Function<T, R> {
028
029  private final Function<T, R> function;
030  private final Function<R, T> inverse;
031
032  public Isomorphism(final Function<T, R> function, final Function<R, T> inverse) {
033    super();
034    if (function == null || inverse == null)
035      throw new IllegalArgumentException(new NullPointerException());
036    this.function = function;
037    this.inverse = inverse;
038  }
039
040  @Override
041  public final R apply(T t) {
042    return function.apply(t);
043  }
044
045  public final T invert(R r) {
046    return inverse.apply(r);
047  }
048
049  public final Function<R, T> inverse() {
050    return inverse;
051  }
052
053}