Last active
February 2, 2016 21:26
-
-
Save pathikrit/5e1ef0bbc620c939a846 to your computer and use it in GitHub Desktop.
Well typed REST skeleton
This file contains hidden or 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
| object TypedRest { | |
| type Id[A] = Long | |
| object Request { | |
| private[this] trait HasId[A] { | |
| val id: Id[A] | |
| } | |
| trait Get[A] extends HasId[A] | |
| trait Put[A] extends HasId[A] | |
| trait Post[A] | |
| trait Patch[A] extends HasId[A] | |
| trait Delete[A] extends HasId[A] | |
| } | |
| import Request._ | |
| trait Repo[A] { | |
| def apply(): Iterable[Get[A]] | |
| def apply(id: Id[A]): Get[A] | |
| def +=(request: Post[A]): Get[A] | |
| def update(request: Put[A]): Get[A] | |
| def update(request: Patch[A]): Get[A] | |
| def -=(request: Delete[A]): Get[A] | |
| } | |
| abstract class CachedRepo[A](cache: Cache[A], repo: Repo[A]) extends Repo[A] { | |
| private[this] def apply(value: Get[A]): Get[A] = { | |
| cache(value.id) = value | |
| value | |
| } | |
| override def apply() = cache.values | |
| override def apply(id: Id[A]) = cache(id) | |
| override def +=(request: Post[A]) = apply(repo += request) | |
| override def update(request: Put[A]) = apply(repo.update(request)) | |
| def update(request: Patch[A]) = apply(repo.update(request)) | |
| def -=(request: Delete[A]) = { | |
| val result = repo -= request | |
| cache.remove(result.id) | |
| result | |
| } | |
| } | |
| type Cache[A] = Map[Id[A], Get[A]] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment