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]
}