From 92ec9e276b481844860a07f1e9e64dff2c4ce7f8 Mon Sep 17 00:00:00 2001 From: Geoffrey Washburn Date: Wed, 16 Apr 2008 14:45:25 +0000 Subject: Improvements to genprod Added uncurry to Function2, swap to Tuple2. --- src/build/genprod.scala | 56 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 19 deletions(-) (limited to 'src/build') diff --git a/src/build/genprod.scala b/src/build/genprod.scala index f7643e9968..c0c6c9c00d 100644 --- a/src/build/genprod.scala +++ b/src/build/genprod.scala @@ -9,15 +9,15 @@ // $Id$ /**

- * This program generates the Product$i classes, where - * 0 <= i <+ MAXWIDTH. + * This program generates the ProductN, TupleN FunctionN classes, where + * 0 <= N <+ MAXWIDTH. *

*

* usage: scala -classpath ... genprod PATH * where PATH is the desired output directory *

* - * @author Burak Emir, Stephane Micheloud + * @author Burak Emir, Stephane Micheloud, Geoffrey Washburn * @version 1.1 */ object genprod { @@ -28,21 +28,14 @@ object genprod { val SUP_FUNCTION_ARITY = 23 def productClassname(i: Int) = "Product"+i - def productFilename(i: Int) = productClassname(i)+".scala" def tupleClassname(i: Int) = "Tuple"+i - def tupleFilename(i: Int) = tupleClassname(i)+".scala" def functionClassname(i: Int) = "Function"+i - def functionFilename(i: Int) = functionClassname(i)+".scala" - def choiceClassname(i: Int) = "Choice"+i - - def choiceFilename(i: Int) = choiceClassname(i)+".scala" - def targs(i: Int) = for (j <- List.range(1, i+1)) yield "T" + j @@ -154,13 +147,18 @@ trait {functionClassname(i)}{__typeArgs__} extends AnyRef {{ def moreMethods(i:Int) = i match { case 1 => """ - /** (f compose g)(x) = f(g(x)) + /** (f compose g)(x) == f(g(x)) */ def compose[A](g: A => T1): A => R = { x => apply(g(x)) } - /** (f andThen g)(x) = g(f(x)) + /** (f andThen g)(x) == g(f(x)) */ def andThen[A](g: R => A): T1 => A = { x => g(apply(x)) } +""" + case 2 => """ + /** f(x,y) == (f.uncurry)(x)(y) + */ + def uncurry: T1 => T2 => R = { (x:T1) => (y:T2) => apply(x,y) } """ case _ => "" } @@ -241,11 +239,13 @@ object TupleFile { // {"$Id$"} -// generated by genprod on {new java.util.Date().toString()} +// generated by genprod on {new java.util.Date().toString()} {if(descriptiveComment(i).length > 0) "(with fancy comment)" else ""} {if(moreMethods(i).length > 0) "(with extra methods)" else ""} package scala -/** {tupleClassname(i)} is the canonical representation of a @see {productClassname(i)} */ +/** {tupleClassname(i)} is the canonical representation of a @see {productClassname(i)} + * {descriptiveComment(i)} + */ case class {tupleClassname(i)}{__typeArgs__}({ __fields__ }) extends {productClassname(i)}{__typeArgRefs__} {{ @@ -260,9 +260,19 @@ case class {tupleClassname(i)}{__typeArgs__}({ __fields__ }) } sb.toString }} + {moreMethods(i)} }} - - } +} + def moreMethods(i:Int) = i match { + case 2 => """ + /** Swap the elements of the tuple */ + def swap: Tuple2[T2,T1] = Tuple2(_2, _1) +""" + case _ => "" + } + def descriptiveComment(i: Int) = i match { + case _ => "" + } } // object TupleFile @@ -287,7 +297,7 @@ object ProductFile { // {"$Id$"} -// generated by genprod on {new java.util.Date().toString()} +// generated by genprod on {new java.util.Date().toString()} {if(descriptiveComment(i).length > 0) "(with fancy comment)" else ""} {if(moreMethods(i).length > 0) "(with extra methods)" else ""} package scala @@ -299,6 +309,7 @@ object {productClassname(i)} {{ }} /** {productClassname(i)} is a cartesian product of {i} components + * {descriptiveComment(i)} */ trait {productClassname(i)}{__typeArgs__} extends Product {{ @@ -324,7 +335,14 @@ trait {productClassname(i)}{__typeArgs__} extends Product {{ {for ((m, t) <- mdefs(i) zip targs(i)) yield "/** projection of this product */\n def " + m + ": " + t + "\n\n" } + + {moreMethods(i)} }} - +} + def moreMethods(i:Int) = i match { + case _ => "" } -} + def descriptiveComment(i: Int) = i match { + case _ => "" + } +}; -- cgit v1.2.3