/*
 *  @author Ranides Atterwim <ranides@gmail.com>
 *  @copyright Ranides Atterwim
 *  @license WTFPL
 *  @url http://ranides.net/projects/assira
 */

package net.ranides.assira.generic;

import java.io.Serializable;

/**
 * Interfejs reprezentujący odwzorowanie odwrotne do {@code S -> T} (funktor, wyrażenie lambda).
 * <p>
 * Może być interpretowany jako uogólnienie interfejsu {@link Runnable}, który
 * reprezentuje funkcję {@code void -> void} (procedurę) albo interfejsu {@link Callable},
 * który reprezentuje funkcję {@code void -> T}.
 * </p>
 * @param <T>
 * @param <S>
 * @author ranides
 */
public interface CoFunction<T,S> extends Serializable {

    /**
     * Bezstanowa metoda implementująca zachowanie funkcji.
     * <p>
     * Może być interpretowana jako transformacja odwrotna do {@code S -> T}.
     * </p>
     * @see Runnable#run
     * @see Callable#call
     * @param value
     * @return
     */
    S inverse(T value);

}
