Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Jake Donham
committed
May 24, 2011
1 parent
3721106
commit 08b5a6d
Showing
7 changed files
with
302 additions
and
47 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
object LogicStateSFKDefunc extends LogicState { | ||
type O[S,A] = Option[(S,A,T[S,A])] | ||
|
||
sealed trait T[S,A] | ||
case class Fail[S,A]() extends T[S,A] | ||
case class Unit[S,A](a: A) extends T[S,A] | ||
case class Or[S,A](t1: T[S,A], t2: () => T[S,A]) extends T[S,A] | ||
case class Bind[S,A,B](t: T[S,A], f: A => T[S,B]) extends T[S,B] | ||
case class Apply[S,A,B](t: T[S,A], f: A => B) extends T[S,B] | ||
case class Filter[S,A](t: T[S,A], p: A => Boolean) extends T[S,A] | ||
case class Unsplit[S,A](fk: FK[O[S,A]]) extends T[S,A] | ||
case class Get[S]() extends T[S,S] | ||
case class Set[S](s: S) extends T[S,scala.Unit] | ||
|
||
def fail[S,A] = Fail() | ||
def unit[S,A](a: A) = Unit(a) | ||
def or[S,A](t1: T[S,A], t2: => T[S,A]) = Or(t1, { () => t2 }) | ||
def bind[S,A,B](t: T[S,A], f: A => T[S,B]) = Bind(t, f) | ||
def apply[S,A,B](t: T[S,A], f: A => B) = Apply(t, f) | ||
def filter[S,A](t: T[S,A], p: A => Boolean) = Filter(t, p) | ||
def get[S] = Get() | ||
def set[S](s: S) = Set(s) | ||
|
||
sealed trait FK[R] | ||
case class FKOr[S,A,R](t: () => T[S,A], s: S, sk: SK[S,A,R], fk: FK[R]) extends FK[R] | ||
case class FKSplit[R](r: R) extends FK[R] | ||
|
||
sealed trait SK[S,A,R] | ||
case class SKBind[S,A,B,R](f: A => T[S,B], sk: SK[S,B,R]) extends SK[S,A,R] | ||
case class SKApply[S,A,B,R](f: A => B, sk: SK[S,B,R]) extends SK[S,A,R] | ||
case class SKFilter[S,A,R](p: A => Boolean, sk: SK[S,A,R]) extends SK[S,A,R] | ||
case class SKSplit[S,A,R](r: (S, A, FK[R]) => R) extends SK[S,A,R] | ||
|
||
sealed trait K[R,R2] | ||
case class KReturn[R]() extends K[R,R] | ||
case class KUnsplit[S,A,R,R2](sk: SK[S,A,R], fk:FK[R], k: K[R,R2]) extends K[O[S,A],R2] | ||
|
||
def split[S,A](s: S, t: T[S,A]) = { | ||
|
||
def applyT[A,R,R2](t: T[S,A], s: S, sk: SK[S,A,R], fk: FK[R], k: K[R,R2]): R2 = | ||
t match { | ||
case Fail() => applyFK(fk, k) | ||
case Unit(a) => applySK(sk, s, a, fk, k) | ||
case Or(t1, t2) => applyT(t1, s, sk, FKOr(t2, s, sk, fk), k) | ||
case Bind(t, f) => applyT(t, s, SKBind(f, sk), fk, k) | ||
case Apply(t, f) => applyT(t, s, SKApply(f, sk), fk, k) | ||
case Filter(t, p) => applyT(t, s, SKFilter(p, sk), fk, k) | ||
case Unsplit(fk2) => applyFK(fk2, KUnsplit(sk, fk, k)) | ||
case Get() => applySK(sk.asInstanceOf[SK[S,S,R]], s, s, fk, k) | ||
case Set(s) => applySK(sk.asInstanceOf[SK[S,scala.Unit,R]], s, (), fk, k) | ||
} | ||
|
||
def applyFK[R,R2](fk: FK[R], k: K[R,R2]): R2 = | ||
fk match { | ||
case FKOr(t, s, sk, fk) => | ||
applyT(t().asInstanceOf[T[S,Any]], | ||
s.asInstanceOf[S], | ||
sk.asInstanceOf[SK[S,Any,R]], | ||
fk, k) | ||
case FKSplit(r) => applyK(k, r) | ||
} | ||
|
||
def applySK[A,R,R2](sk: SK[S,A,R], s: S, a: A, fk: FK[R], k: K[R,R2]): R2 = | ||
sk match { | ||
case SKBind(f, sk) => applyT(f(a), s, sk, fk, k) | ||
case SKApply(f, sk) => applySK(sk, s, f(a), fk, k) | ||
case SKFilter(p, sk) => | ||
if (p(a)) applySK(sk, s, a, fk, k) else applyFK(fk, k) | ||
case SKSplit(rf) => applyK(k, rf(s, a, fk)) | ||
} | ||
|
||
def applyK[R,R2](k: K[R,R2], r: R): R2 = | ||
k match { | ||
case KReturn() => r.asInstanceOf[R2] | ||
case KUnsplit(sk, fk, k) => { | ||
r match { | ||
case None => applyFK(fk, k) | ||
case Some((s, a, t)) => | ||
applyT(or(unit(a), t.asInstanceOf[T[S,Any]]), | ||
s.asInstanceOf[S], | ||
sk.asInstanceOf[SK[S,Any,Any]], | ||
fk, k) | ||
} | ||
} | ||
} | ||
|
||
applyT[A,O[S,A],O[S,A]]( | ||
t, | ||
s, | ||
SKSplit((s, a, fk) => Some((s, a, Unsplit(fk)))), | ||
FKSplit(None), | ||
KReturn()) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
object LogicStateSFKDefuncTailrec extends LogicState { | ||
type O[S,A] = Option[(S,A,T[S,A])] | ||
|
||
type T[S,A] = I | ||
|
||
sealed trait I | ||
|
||
case class Fail() extends I | ||
case class Unit(a: Any) extends I | ||
case class Or(t1: I, t2: () => I) extends I | ||
case class Bind(t: I, f: Any => I) extends I | ||
case class Apply(t: I, f: Any => Any) extends I | ||
case class Filter(t: I, p: Any => Boolean) extends I | ||
case class Unsplit(fk: I) extends I | ||
case object Get extends I | ||
case class Set(s: Any) extends I | ||
|
||
case class FKOr(t: () => I, s: Any, sk: I, fk: I) extends I | ||
case class FKSplit(r: O[Any,Any]) extends I | ||
|
||
case class SKBind(f: Any => I, sk: I) extends I | ||
case class SKApply(f: Any => Any, sk: I) extends I | ||
case class SKFilter(p: Any => Boolean, sk: I) extends I | ||
case class SKSplit(r: (Any, Any, I) => O[Any,Any]) extends I | ||
|
||
case object KReturn extends I | ||
case class KUnsplit(sk: I, fk: I, k: I) extends I | ||
|
||
def fail[S,A]: T[S,A] = Fail() | ||
def unit[S,A](a: A): T[S,A] = Unit(a) | ||
def or[S,A](t1: T[S,A], t2: => T[S,A]): T[S,A] = Or(t1, { () => t2 }) | ||
def bind[S,A,B](t: T[S,A], f: A => T[S,B]): T[S,B] = | ||
Bind(t, f.asInstanceOf[Any => I]) | ||
def apply[S,A,B](t: T[S,A], f: A => B): T[S,B] = | ||
Apply(t, f.asInstanceOf[Any => I]) | ||
def filter[S,A](t: T[S,A], p: A => Boolean): T[S,A] = | ||
Filter(t, p.asInstanceOf[Any => Boolean]) | ||
def get[S]: T[S,S] = Get | ||
def set[S](s: S): T[S,scala.Unit] = Set(s) | ||
|
||
def split[S,A](s: S, t: T[S,A]): O[S,A] = { | ||
|
||
def apply(i: I, s: Any, a: Any, r: O[Any,Any], sk: I, fk: I, k: I): O[Any,Any] = | ||
i match { | ||
case Fail() => apply(fk, null, null, null, null, null, k) | ||
case Unit(a) => apply(sk, s, a, null, null, fk, k) | ||
case Or(t1, t2) => apply(t1, s, null, null, sk, FKOr(t2, s, sk, fk), k) | ||
case Bind(t, f) => apply(t, s, null, null, SKBind(f, sk), fk, k) | ||
case Apply(t, f) => apply(t, s, null, null, SKApply(f, sk), fk, k) | ||
case Filter(t, p) => apply(t, s, null, null, SKFilter(p, sk), fk, k) | ||
case Unsplit(fk2) => apply(fk2, null, null, null, null, null, KUnsplit(sk, fk, k)) | ||
case Get => apply(sk, s, s, null, null, fk, k) | ||
case Set(s) => apply(sk, s, (), null, null, fk, k) | ||
|
||
case FKOr(t, s, sk, fk) => apply(t(), s, null, null, sk, fk, k) | ||
case FKSplit(r) => apply(k, null, null, r, null, null, null) | ||
|
||
case SKBind(f, sk) => apply(f(a), s, null, null, sk, fk, k) | ||
case SKApply(f, sk) => apply(sk, s, f(a), null, null, fk, k) | ||
case SKFilter(p, sk) => | ||
if (p(a)) | ||
apply(sk, s, a, null, null, fk, k) | ||
else | ||
apply(fk, null, null, null, null, null, k) | ||
case SKSplit(rf) => | ||
apply(k, null, null, rf(s, a, fk), null, null, null) | ||
|
||
case KReturn => r | ||
case KUnsplit(sk, fk, k) => { | ||
r match { | ||
case None => apply(fk, null, null, null, null, null, k) | ||
case Some((s, a, t)) => | ||
apply(or(unit(a), t), s, null, null, sk, fk, k) | ||
} | ||
} | ||
} | ||
|
||
apply(t, | ||
s.asInstanceOf[Any], | ||
null, | ||
null, | ||
SKSplit((s, a, fk) => Some((s, a, Unsplit(fk)))), | ||
FKSplit(None), | ||
KReturn).asInstanceOf[O[S,A]] | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
trait LogicStateT extends LogicState { | ||
val Logic: Logic | ||
|
||
type T[S,A] = S => Logic.T[(S, A)] | ||
|
||
def fail[S,A] = { s: S => Logic.fail } | ||
def unit[S,A](a: A) = { s: S => Logic.unit((s, a)) } | ||
|
||
def or[S,A](t1: T[S,A], t2: => T[S,A]) = | ||
{ s: S => Logic.or(t1(s), t2(s)) } | ||
|
||
def bind[S,A,B](t: T[S,A], f: A => T[S,B]) = { | ||
val f2: ((S,A)) => Logic.T[(S,B)] = { case (s, a) => f(a)(s) } | ||
{ s: S => Logic.bind(t(s), f2) } | ||
} | ||
|
||
def apply[S,A,B](t: T[S,A], f: A => B) = { | ||
val f2: ((S,A)) => ((S,B)) = { case (s, a) => (s, f(a)) } | ||
{ s: S => Logic.apply(t(s), f2) } | ||
} | ||
|
||
def filter[S,A](t: T[S,A], p: A => Boolean) = | ||
{ s: S => Logic.filter(t(s), { sa: (S,A) => p(sa._2) }) } | ||
|
||
def split[S,A](s: S, t: T[S,A]) = { | ||
Logic.split(t(s)) match { | ||
case None => None | ||
case Some(((s, a), t)) => Some((s, a, { _ => t })) | ||
} | ||
} | ||
|
||
def get[S] = { s: S => Logic.unit((s,s)) } | ||
def set[S](s: S) = { _: S => Logic.unit((s,())) } | ||
} |
Oops, something went wrong.