package com.google.android.material.motion;

/**
 * An operation is able to transform incoming values before choosing whether or not to pass them
 * downstream.
 *
 * @param <T> The incoming value type.
 * @param <U> The downstream value type.
 */
public abstract class Operation<T, U> {

  public void preConnect(MotionObserver<U> observer) {
  }

  /**
   * Transforms the incoming value before passing it to the observer, or blocks the value.
   *
   * @param value The incoming value.
   */
  public abstract void next(MotionObserver<U> observer, T value);

  public void postConnect(MotionObserver<U> observer) {
  }

  public void preDisconnect(MotionObserver<U> observer) {
  }

  public void postDisconnect(MotionObserver<U> observer) {
  }
}
