Skip to content

Instantly share code, notes, and snippets.

@hilltracer
Created June 1, 2023 17:48
Show Gist options
  • Save hilltracer/2aa4c354000e2cc0a51b43a565aede8a to your computer and use it in GitHub Desktop.
Save hilltracer/2aa4c354000e2cc0a51b43a565aede8a to your computer and use it in GitHub Desktop.
import scala.annotation.tailrec
import cats.Eval
final class ParMetaData(connectiveUsedFn: Eval[Boolean]) {
lazy val connectiveUsed: Eval[Boolean] = connectiveUsedFn
}
sealed trait Par {
protected def meta: ParMetaData
lazy val connectiveUsed: Boolean = meta.connectiveUsed.value
}
sealed trait Expr extends Par
def cUsedParSeq(ps: Seq[Par]) = ps.exists(_.connectiveUsed)
def connectiveUsedParProc(ps: Seq[Par]): Boolean = cUsedParSeq(ps)
def connectiveUsedGInt(v: Long): Boolean = false
class ParProc(val ps: Seq[Par], protected val meta: ParMetaData) extends Par {}
object ParProc {
def apply(ps: Seq[Par]): ParProc = createParProc(ps)
def createParProc(ps: Seq[Par]): ParProc = {
val meta = new ParMetaData(Eval.later(connectiveUsedParProc(ps)))
new ParProc(ps, meta)
}
}
final class GInt(val v: Long, protected val meta: ParMetaData) extends Expr
object GInt {
def apply(v: Long): GInt = createGInt(v)
def createGInt(v: Long): GInt = {
val meta = new ParMetaData(Eval.later(connectiveUsedGInt(v)))
new GInt(v, meta)
}
}
@tailrec
def hugePar(n: Int, par: Par = GInt(0)): Par =
if (n == 0) par
else hugePar(n - 1, ParProc(Seq(par)))
val par = hugePar(5000)
println("!!!!")
println(par.connectiveUsed)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment