From c6acfd965279da0ea5c0436310750501ba81c07f Mon Sep 17 00:00:00 2001 From: Jason Gross Date: Fri, 15 Jun 2018 16:03:48 -0400 Subject: Add ErrorT monad, and Show class --- src/Util/ErrorT.v | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/Util/ErrorT.v (limited to 'src/Util/ErrorT.v') diff --git a/src/Util/ErrorT.v b/src/Util/ErrorT.v new file mode 100644 index 000000000..ab8634e2c --- /dev/null +++ b/src/Util/ErrorT.v @@ -0,0 +1,23 @@ +Require Import Crypto.Util.Notations. + +Inductive ErrorT {ErrT T} := +| Success (v : T) +| Error (msg : ErrT). + +Global Arguments ErrorT : clear implicits. +Delimit Scope error_scope with error. +Bind Scope error_scope with ErrorT. + +Definition invert_result {ErrT T} (v : ErrorT ErrT T) + := match v return match v with Success _ => T | _ => ErrT end with + | Success v => v + | Error msg => msg + end. + +Definition bind {A B ErrT} (x : ErrorT ErrT A) (k : A -> ErrorT ErrT B) : ErrorT ErrT B + := match x with + | Success v => k v + | Error msg => Error msg + end. + +Notation "x <- y ; f" := (bind y (fun x => f%error)) : error_scope. -- cgit v1.2.3