[MLton-commit] r5025

Vesa Karvonen vesak at mlton.org
Fri Jan 12 04:25:47 PST 2007


Initial commit of a lib of misc utils to be refactored.
----------------------------------------------------------------------

A   mltonlib/trunk/com/ssh/misc-util/unstable/eq.sml

----------------------------------------------------------------------

Added: mltonlib/trunk/com/ssh/misc-util/unstable/eq.sml
===================================================================
--- mltonlib/trunk/com/ssh/misc-util/unstable/eq.sml	2007-01-12 12:25:32 UTC (rev 5024)
+++ mltonlib/trunk/com/ssh/misc-util/unstable/eq.sml	2007-01-12 12:25:43 UTC (rev 5025)
@@ -0,0 +1,93 @@
+(* Copyright (C) 2007 SSH Communications Security, Helsinki, Finland
+ *
+ * This code is released under the MLton license, a BSD-style license.
+ * See the LICENSE file or http://mlton.org/License for details.
+ *)
+
+(*
+ * An implementation of a type-indexed equality relation.  For equality
+ * types the semantics is the same as SML's built-in equality.  User
+ * defined types, exceptions, and reals are given a natural, structural,
+ * semantics of equality.  Functions, obviously, can't be supported.
+ *)
+
+signature EQ = sig
+   type 'a eq_t
+
+   val eq : 'a eq_t -> 'a BinPr.t
+   (**
+    * Extracs the equality relation.  Note that the type parameter {'a}
+    * isn't an equality type variable.
+    *)
+
+   val notEq : 'a eq_t -> 'a BinPr.t
+   (** {notEq t = not o eq t} *)
+end
+
+functor LiftEq
+           (include EQ
+            type 'a t
+            val lift : ('a eq_t, 'a t) Lift.t Thunk.t) : EQ = struct
+   type 'a eq_t = 'a t
+   val eq    = fn ? => Lift.get lift eq    ?
+   val notEq = fn ? => Lift.get lift notEq ?
+end
+
+structure Eq :> sig
+   include STRUCTURAL_TYPE
+   include EQ where type 'a eq_t = 'a t
+end = struct
+   type 'a t = 'a BinPr.t
+   type 'a eq_t = 'a t
+
+   val eq = id
+   val notEq = negate
+
+   fun iso b (a2b, _) = b o Pair.map (Sq.mk a2b)
+
+   val op *` = Product.equal
+   val op +` = Sum.equal
+
+   val Y = Tie.function
+
+   local
+      val e = Fail "Eq.--> not supported"
+   in
+      fun _ --> _ = failing e
+   end
+
+   val exn : exn t ref = ref TypeUtil.failExnSq
+   fun regExn t (_, prj) =
+       Ref.modify (fn exn =>
+                      fn (l, r) =>
+                         case prj l & prj r of
+                            SOME l & SOME r => t (l, r)
+                          | SOME _ & NONE   => false
+                          | NONE   & SOME _ => false
+                          | NONE   & NONE   => exn (l, r)) exn
+   val exn = fn ? => !exn ?
+
+   fun array _ = op =
+   fun refc _ = op =
+
+   val list = ListPair.allEq
+
+   fun vector eq = iso (list eq) Vector.isoList (* XXX can be optimized *)
+
+   val bool   = op =
+   val char   = op =
+   val int    = op =
+   val real   = Real.==
+   val string = op =
+   val unit   = op =
+   val word   = op =
+
+   val largeInt  = op =
+   val largeReal = LargeReal.==
+   val largeWord = op =
+
+   val word8  = op =
+   val word16 = op =
+   val word32 = op =
+   val word64 = op =
+end


Property changes on: mltonlib/trunk/com/ssh/misc-util/unstable/eq.sml
___________________________________________________________________
Name: svn:eol-style
   + native




More information about the MLton-commit mailing list