Skip to content

Instantly share code, notes, and snippets.

@mushtaq
Created December 1, 2017 05:49
Show Gist options
  • Save mushtaq/9c41bab78a7561bc0d751c6683d5a777 to your computer and use it in GitHub Desktop.
Save mushtaq/9c41bab78a7561bc0d751c6683d5a777 to your computer and use it in GitHub Desktop.
def foldLeft[Elm, Res](xs: List[Elm], seed: Res)(combine: (Res, Elm) => Res): Res = xs match {
case Nil => seed
case head :: tail => foldLeft(tail, combine(seed, head))(combine)
}
sealed trait Fn[Res] {
def invoke(x: Res): Res
}
case class Identity[Res]() extends Fn[Res] {
override def invoke(x: Res): Res = x
override def toString: String = "identity"
}
case class AccFn[Res, Elm](acc: Fn[Res], elm: Elm, combine: (Elm, Res) => Res) extends Fn[Res] {
override def invoke(x: Res): Res = {
println((elm, x))
acc.invoke(combine(elm, x))
}
override def toString: String = s"AccFn($acc, $elm, combine)"
}
//AccFn(AccFn(AccFn(AccFn(identity, 1, combine), 2, combine), 3, combine), 4, combine)
//(4,0)
//(3,4)
//(2,7)
//(1,9)
def foldRight[Elm, Res](xs: List[Elm], seed: Res)(combine: (Elm, Res) => Res): Res = {
val function: Res => Res = foldLeft(xs, identity[Res] _) { (acc, elm) =>
b => {
println((elm, b))
acc(combine(elm, b))
}
}
println(function)
function(seed)
}
def foldRight2[Elm, Res](xs: List[Elm], seed: Res)(combine: (Elm, Res) => Res): Res = {
val fn: Fn[Res] = foldLeft[Elm, Fn[Res]](xs, Identity()) { (acc, elm) =>
AccFn(acc, elm, combine)
}
println(fn)
fn.invoke(seed)
}
//foldRight(List(1, 2, 3, 4), 0)(_ + _)
foldRight2(List(1, 2, 3, 4), 0)(_ + _)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment