summaryrefslogtreecommitdiff
path: root/src/build/genprod.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/build/genprod.scala')
-rw-r--r--src/build/genprod.scala56
1 files changed, 37 insertions, 19 deletions
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$
/** <p>
- * This program generates the <code>Product$i</code> classes, where
- * <code>0 &lt;= i &lt;+ MAXWIDTH</code>.
+ * This program generates the <code>ProductN</code>, <code>TupleN</code> <code>FunctionN</code> classes, where
+ * <code>0 &lt;= N &lt;+ MAXWIDTH</code>.
* </p>
* <p>
* usage: <code>scala -classpath ... genprod PATH</code>
* where <code>PATH</code> is the desired output directory
* </p>
*
- * @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,14 +147,19 @@ 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 _ => ""
}
def descriptiveComment(i: Int) = i match {
@@ -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)}
}}
-</file>
- }
+</file>}
+ 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)}
}}
-</file>
+</file>}
+ def moreMethods(i:Int) = i match {
+ case _ => ""
}
-}
+ def descriptiveComment(i: Int) = i match {
+ case _ => ""
+ }
+};