src/Pure/ML-Systems/universal.ML
author wenzelm
Thu, 17 Dec 2015 17:32:01 +0100
changeset 61862 e2a9e46ac0fb
parent 29564 f8b933a62151
permissions -rw-r--r--
support pretty break indent, like underlying ML systems;

(*  Title:      Pure/ML-Systems/universal.ML
    Author:     Makarius

Universal values via tagged union.  Emulates structure Universal
from Poly/ML 5.1.
*)

signature UNIVERSAL =
sig
  type universal
  type 'a tag
  val tag: unit -> 'a tag
  val tagIs: 'a tag -> universal -> bool
  val tagInject: 'a tag -> 'a -> universal
  val tagProject: 'a tag -> universal -> 'a
end;

structure Universal: UNIVERSAL =
struct

type universal = exn;

datatype 'a tag = Tag of
 {is: universal -> bool,
  inject: 'a -> universal,
  project: universal -> 'a};

fun tag () =
  let exception Universal of 'a in
   Tag {
    is = fn Universal _ => true | _ => false,
    inject = Universal,
    project = fn Universal x => x}
  end;

fun tagIs (Tag {is, ...}) = is;
fun tagInject (Tag {inject, ...}) = inject;
fun tagProject (Tag {project, ...}) = project;

end;