[MLton-commit] r5029
Vesa Karvonen
vesak at mlton.org
Fri Jan 12 04:27:25 PST 2007
Initial commit of a lib of misc utils to be refactored.
----------------------------------------------------------------------
A mltonlib/trunk/com/ssh/misc-util/unstable/fold.sml
----------------------------------------------------------------------
Added: mltonlib/trunk/com/ssh/misc-util/unstable/fold.sml
===================================================================
--- mltonlib/trunk/com/ssh/misc-util/unstable/fold.sml 2007-01-12 12:27:09 UTC (rev 5028)
+++ mltonlib/trunk/com/ssh/misc-util/unstable/fold.sml 2007-01-12 12:27:21 UTC (rev 5029)
@@ -0,0 +1,87 @@
+(* 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.
+ *)
+
+(*
+ * Utility module for defining "variadic" type-indexed functions in SML.
+ *
+ * See
+ *
+ * http://mlton.org/Fold
+ *
+ * for extensive discussion of the subject.
+ *)
+
+structure Fold = struct
+ type ('a, 'b, 'c, 'd) step =
+ 'a * ('b -> 'c) -> 'd
+ type ('a, 'b, 'c, 'd) t =
+ ('a, 'b, 'c, 'd) step -> 'd
+ type ('a, 'b, 'c, 'd, 'e) step0 =
+ ('a, 'c, 'd, ('b, 'c, 'd, 'e) t) step
+ type ('a, 'b, 'c, 'd, 'e, 'f) step1 =
+ ('b, 'd, 'e, 'a -> ('c, 'd, 'e, 'f) t) step
+end
+
+signature FOLD = sig
+ type ('a, 'b, 'c, 'd) step =
+ ('a, 'b, 'c, 'd) Fold.step
+ type ('a, 'b, 'c, 'd) t =
+ ('a, 'b, 'c, 'd) Fold.t
+ type ('a, 'b, 'c, 'd, 'e) step0 =
+ ('a, 'b, 'c, 'd, 'e) Fold.step0
+ type ('a, 'b, 'c, 'd, 'e, 'f) step1 =
+ ('a, 'b, 'c, 'd, 'e, 'f) Fold.step1
+
+ val fold : 'a * ('b -> 'c) -> ('a, 'b, 'c, 'd) t
+ val unfold : ('a, 'b, 'c, 'a * ('b -> 'c)) t
+ -> 'a * ('b -> 'c)
+ val lift : ('a, 'b, 'c, 'a * ('b -> 'c)) t
+ -> ('a, 'b, 'c, 'd) t
+
+ val post : ('a -> 'd)
+ -> ('b, 'c, 'a, 'b * ('c -> 'a)) t
+ -> ('b, 'c, 'd, 'e) t
+
+ val step0 : ('a -> 'b)
+ -> ('a, 'b, 'c, 'd, 'e) step0
+ val step1 : ('a * 'b -> 'c)
+ -> ('a, 'b, 'c, 'd, 'e, 'f) step1
+
+ val unstep0 : ('a, 'b, 'b, 'b, 'b) step0
+ -> 'a -> 'b
+ val unstep1 : ('a, 'b, 'c, 'c, 'c, 'c) step1
+ -> 'a * 'b -> 'c
+
+ val lift0 : ('a, 'b, 'b, 'b, 'b) step0
+ -> ('a, 'b, 'c, 'd, 'e) step0
+ val lift1 : ('a, 'b, 'c, 'c, 'c, 'c) step1
+ -> ('a, 'b, 'c, 'd, 'e, 'f) step1
+ val lift0to1 : ('b, 'c, 'c, 'c, 'c) step0
+ -> ('a, 'b, 'c, 'd, 'e, 'f) step1
+end
+
+fun $ (x, f) = f x
+
+structure Fold :> FOLD = struct
+ open Fold
+
+ val fold = pass
+ fun unfold f = f id
+ fun lift ? = (fold o unfold) ?
+
+ fun post g = fold o Pair.map (id, fn f => g o f) o unfold
+
+ fun step0 h (a1, f) = fold (h a1, f)
+ fun step1 h (a2, f) a1 = fold (h (a1, a2), f)
+
+ fun unstep0 s a1 = fold (a1, id) s $
+ fun unstep1 s (a1, a2) = fold (a2, id) s a1 $
+
+ fun lift0 ? = (step0 o unstep0) ?
+ fun lift1 ? = (step1 o unstep1) ?
+
+ fun lift0to1 s = step1 (unstep0 s o Pair.snd)
+end
Property changes on: mltonlib/trunk/com/ssh/misc-util/unstable/fold.sml
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the MLton-commit
mailing list