override def apply()

in algebird-core/src/main/scala/com/twitter/algebird/monad/Reader.scala [44:61]


  override def apply(env: E): T = {
    @annotation.tailrec
    def loop(r: Reader[E, Any], stack: List[(Any) => Reader[E, Any]]): Any =
      r match {
        case ConstantReader(get) =>
          stack match {
            case head :: tail => loop(head(get), tail)
            case Nil          => get
          }
        case ReaderFn(fn) =>
          stack match {
            case head :: tail => loop(head(fn(env)), tail)
            case Nil          => fn(env)
          }
        case FlatMappedReader(first, nextFn) => loop(first, nextFn :: stack)
      }
    loop(first, List(fn.asInstanceOf[(Any) => Reader[E, Any]])).asInstanceOf[T]
  }