summaryrefslogtreecommitdiff
path: root/test/files/pos/depmet_implicit_oopsla_session.scala
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2010-09-16 22:26:24 +0000
committerAdriaan Moors <adriaan.moors@epfl.ch>2010-09-16 22:26:24 +0000
commite557acb9a7d672c0635c3eaf9fe385adc41e5c86 (patch)
treed13db6639464acc57f0e44b4b3ef6f3e607ad403 /test/files/pos/depmet_implicit_oopsla_session.scala
parentce223fe7abc47af712382a64404604e75f9f4d20 (diff)
downloadscala-e557acb9a7d672c0635c3eaf9fe385adc41e5c86.tar.gz
scala-e557acb9a7d672c0635c3eaf9fe385adc41e5c86.tar.bz2
scala-e557acb9a7d672c0635c3eaf9fe385adc41e5c86.zip
part 2 of the dependent method refactoring: imp...
part 2 of the dependent method refactoring: improved interaction with implicit search (needed for oopsla paper) more to come in this area, see e.g. #3346 (stanford edsl stuff) reopens #13, which wasn't fixed properly before imo, anyway (have a look at -Xprint:typer output before this commit: a type that's not expressible in surface syntax is inferred -- also removed duplicate test file) closes #3731: co-evolve type alias type symbols when their rhs is updated and they are referenced by type selections (see typemap) review by odersky
Diffstat (limited to 'test/files/pos/depmet_implicit_oopsla_session.scala')
-rw-r--r--test/files/pos/depmet_implicit_oopsla_session.scala63
1 files changed, 63 insertions, 0 deletions
diff --git a/test/files/pos/depmet_implicit_oopsla_session.scala b/test/files/pos/depmet_implicit_oopsla_session.scala
new file mode 100644
index 0000000000..21588a56ad
--- /dev/null
+++ b/test/files/pos/depmet_implicit_oopsla_session.scala
@@ -0,0 +1,63 @@
+object Sessions {
+ trait Session[This] {
+ type Dual
+ type HasDual[D] = Session[This]{type Dual=D}
+ def run(p: This, dp: Dual): Unit
+ }
+
+ implicit object StopSession extends Session[Stop] {
+ type Dual = Stop
+
+ def run(p: Stop, dp: Stop): Unit = {}
+ }
+
+ implicit def InDual[A, B](implicit sessionDIn: Session[B]) =
+ new Session[In[A, B]] {
+ type Dual = Out[A, sessionDIn.Dual]
+
+ def run(p: In[A, B], dp: Dual): Unit =
+ sessionDIn.run(p.func(dp.x), dp.y)
+ }
+
+ implicit def OutDual[A, B](implicit sessionDOut: Session[B]) =
+ new Session[Out[A, B]] {
+ type Dual = In[A, sessionDOut.Dual]
+
+ def run(p: Out[A, B], dp: Dual): Unit =
+ sessionDOut.run(p.y, dp.func(p.x))
+ }
+
+ sealed case class Stop()
+ sealed case class In[-A, +B](func: A => B)
+ sealed case class Out[+A, +B](x: A, y: B)
+
+ def addServer =
+ In{x: Int =>
+ In{y: Int => System.out.println("Thinking")
+ Out(x+y,
+ Stop())}}
+
+ def addClient =
+ Out(3,
+ Out(4, { System.out.println("Waiting")
+ In{z: Int => System.out.println(z)
+ Stop()}}))
+
+ def runSession[S, D: Session[S]#HasDual](p: S, dp: D) =
+ implicitly[Session[S]#HasDual[D]].run(p, dp)
+
+ // def runSession[S, D](p: S, dp: D)(implicit s: Session[S]#HasDual[D]) =
+ // s.run(p, dp)
+ //
+ // def runSession[S, D](p: S, dp: D)(implicit s: Session[S]{type Dual=D}) =
+ // s.run(p, dp)
+
+ // TODO: can we relax the ordering restrictions on dependencies so that we can use
+ // def runSession[S](p: S, dp: s.Dual)(implicit s: Session[S]) =
+ // s.run(p, dp)
+ // to emphasise similarity of type parameters and implicit arguments:
+ // def runSession[S][val s: Session[S]](p: S, dp: s.Dual) =
+ // s.run(p, dp)
+
+ def myRun = runSession(addServer, addClient)
+} \ No newline at end of file