Created
June 1, 2023 17:48
-
-
Save hilltracer/2aa4c354000e2cc0a51b43a565aede8a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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