added missing file from last commit. no review.

git-svn-id: http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk@21142 5e8d7ff9-d8ef-0310-90f0-a4852d11357a
This commit is contained in:
rompf 2010-03-11 20:36:43 +00:00
parent 0a8b0af0a2
commit e03ac2c949
1 changed files with 60 additions and 0 deletions

View File

@ -0,0 +1,60 @@
// $Id$
package scala.util.continuations
class cpsParam[-B,+C] extends StaticAnnotation with TypeConstraint
private class cpsSym[B] extends Annotation // implementation detail
private class cpsSynth extends Annotation // implementation detail
private class cpsPlus extends StaticAnnotation with TypeConstraint // implementation detail
private class cpsMinus extends Annotation // implementation detail
@serializable final class ControlContext[+A,-B,+C](val fun: (A => B) => C, val x: A) {
final def map[A1](f: (A => A1)): ControlContext[A1,B,C] = {
if (fun eq null)
new ControlContext(null, f(x))
else
new ControlContext((k:(A1 => B)) => fun((x:A) => k(f(x))), null.asInstanceOf[A1])
}
/*
final def flatMap[A1,B1<:B](f: (A => ControlContext[A1,B1,B])): ControlContext[A1,B1,C] = {
new ControlContext((k:(A1 => B1)) => fun((x:A) => f(x).fun(k)))
}
*/
// it would be nice if @inline would turn the trivial path into a tail call.
// unfortunately it doesn't, so we do it ourselves in SelectiveCPSTransform
/*@inline*/ final def flatMap[A1,B1,C1<:B](f: (A => ControlContext[A1,B1,C1])): ControlContext[A1,B1,C] = {
if (fun eq null)
f(x).asInstanceOf[ControlContext[A1,B1,C]]
else
new ControlContext({ k:(A1 => B1) =>
fun { (x:A) =>
val ctxR = f(x)
val res: C1 = ctxR.foreach(k)
res
}
}, null.asInstanceOf[A1])
}
final def foreach(f: (A => B)) = {
if (fun eq null)
f(x).asInstanceOf[C]
else
fun(f)
}
final def isTrivial = fun eq null
final def getTrivialValue = x.asInstanceOf[A]
// need filter or other functions?
}