// Path: library/src/main/java/com/google/android/material/motion/MapOperation.java
// public abstract class MapOperation<T, U> extends Operation<T, U> {
// 
//   /**
//    * Transforms the given value to another value.
//    */
//   public abstract U transform(T value);
// 
//   @Override
//   public final void next(MotionObserver<U> observer, T value) {
//     observer.next(transform(value));
//   }
// }
// 
// Path: library/src/main/java/com/google/android/material/motion/Operation.java
// 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) {
//   }
// }


import android.support.annotation.VisibleForTesting;
import android.util.Log;
import com.google.android.material.motion.MapOperation;
import com.google.android.material.motion.Operation;
package com.google.android.material.motion.operators;



public final class LogOp {

  @VisibleForTesting
  LogOp() {
    throw new UnsupportedOperationException();
  }

  public static <T> Operation<T, T> log(final String tag) {
    return log(tag, "");
  }

  public static <T> Operation<T, T> log(final String tag, final String prefix) {
    return log(Log.DEBUG, tag, prefix);
  }

// Path: library/src/main/java/com/google/android/material/motion/MapOperation.java
// public abstract class MapOperation<T, U> extends Operation<T, U> {
// 
//   /**
//    * Transforms the given value to another value.
//    */
//   public abstract U transform(T value);
// 
//   @Override
//   public final void next(MotionObserver<U> observer, T value) {
//     observer.next(transform(value));
//   }
// }
// 
// Path: library/src/main/java/com/google/android/material/motion/Operation.java
// 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) {
//   }
// }


// Path: library/src/main/java/com/google/android/material/motion/operators/LogOp.java
import android.support.annotation.VisibleForTesting;
import android.util.Log;
import com.google.android.material.motion.MapOperation;
import com.google.android.material.motion.Operation;

package com.google.android.material.motion.operators;



public final class LogOp {

  @VisibleForTesting
  LogOp() {
    throw new UnsupportedOperationException();
  }

  public static <T> Operation<T, T> log(final String tag) {
    return log(tag, "");
  }

  public static <T> Operation<T, T> log(final String tag, final String prefix) {
    return log(Log.DEBUG, tag, prefix);
  }

  public static <T> Operation<T, T> log(final int priority, final String tag, final String prefix) {