All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.ericmedvet.jgea.experimenter.InvertibleMapper Maven / Gradle / Ivy

/*-
 * ========================LICENSE_START=================================
 * jgea-experimenter
 * %%
 * Copyright (C) 2018 - 2023 Eric Medvet
 * %%
 * 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.
 * =========================LICENSE_END==================================
 */

package io.github.ericmedvet.jgea.experimenter;

import java.util.function.BiFunction;
import java.util.function.Function;

public interface InvertibleMapper {
  T exampleFor(R r);

  Function mapperFor(R r);

  static  InvertibleMapper from(BiFunction mapperF, Function exampleF) {
    return new InvertibleMapper<>() {
      @Override
      public T exampleFor(R r) {
        return exampleF.apply(r);
      }

      @Override
      public Function mapperFor(R r) {
        return t -> mapperF.apply(r, t);
      }
    };
  }

  static  InvertibleMapper identity() {
    return InvertibleMapper.from((t, t2) -> t2, t -> t);
  }

  default  InvertibleMapper andThen(InvertibleMapper otherMapper) {
    InvertibleMapper thisMapper = this;
    return from(
        (q, t) ->
            otherMapper
                .mapperFor(q)
                .apply(thisMapper.mapperFor(otherMapper.exampleFor(q)).apply(t)),
        q -> thisMapper.exampleFor(otherMapper.exampleFor(q)));
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy