src/HOL/Library/Tools/lazy.scala
author haftmann
Sun, 30 Mar 2025 13:50:06 +0200
changeset 82379 3f875966c3e1
permissions -rw-r--r--
optional external files as code modules
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
82379
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
     1
/* Author: Pascal Stoop, ETH Zurich
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
     2
   Author: Andreas Lochbihler, Digital Asset */
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
     3
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
     4
object Lazy {
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
     5
  final class Lazy[A] (f: Unit => A) {
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
     6
    var evaluated = false;
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
     7
    lazy val x: A = f(())
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
     8
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
     9
    def get() : A = {
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    10
      evaluated = true;
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    11
      return x
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    12
    }
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    13
  }
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    14
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    15
  def force[A] (x: Lazy[A]) : A = {
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    16
    return x.get()
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    17
  }
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    18
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    19
  def delay[A] (f: Unit => A) : Lazy[A] = {
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    20
    return new Lazy[A] (f)
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    21
  }
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    22
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    23
  def termify_lazy[Typerep, Term, A] (
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    24
    const: String => Typerep => Term,
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    25
    app: Term => Term => Term,
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    26
    abs: String => Typerep => Term => Term,
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    27
    unitT: Typerep,
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    28
    funT: Typerep => Typerep => Typerep,
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    29
    lazyT: Typerep => Typerep,
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    30
    term_of: A => Term,
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    31
    ty: Typerep,
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    32
    x: Lazy[A],
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    33
    dummy: Term) : Term = {
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    34
    x.evaluated match {
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    35
      case true => app(const("Code_Lazy.delay")(funT(funT(unitT)(ty))(lazyT(ty))))(abs("_")(unitT)(term_of(x.get())))
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    36
      case false => app(const("Code_Lazy.delay")(funT(funT(unitT)(ty))(lazyT(ty))))(const("Pure.dummy_pattern")(funT(unitT)(ty)))
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    37
    }
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    38
  }
3f875966c3e1 optional external files as code modules
haftmann
parents:
diff changeset
    39
}