bakery from the black lagoon

44
…from the BLACK LAGOON

Upload: reuben-doetsch

Post on 06-Jul-2016

12 views

Category:

Documents


0 download

DESCRIPTION

A paper on Scala's robust capabilities.

TRANSCRIPT

…from theBLACK LAGOON

traitUserModule{

defloadUser(id:Long): User}traitTweetModule{

defpost(userId:Long, body: String)

classFoo(x:Int) {

defadd(y:Int

traitForall{

def

traitExists{

typeA

traitExists{

typeA

deffoo(a: A): Option[A]}

Q: What is the essence of modularity?

A: Informationhiding!

traitThing[-A, +B]{

typeX

defsource(a: A): X

defbippy(t: Thing[Int, String]) = {

valstate: t.X

It’s a module, Jim, but not as weknow it…

traitUserModule{

deflogin(name: String, pass: String) = {

// do stuff}

defsave(user: User) {

traitMessageModule

extendsUserModule{

defrender(msg: Message): Group[Node]= {

// yay, anti-xml user!}

uh oh…

traitMessageModule

extendsUserModule{

objectmessage{

defrender(msg: Message): Group[Node]= {

// yay, anti-xml user!

traitUserModule{

deflogin(name: String,pass: String): Option[User]

defsave(user: User):Unit

traitMongoUserModule

extendsUserModule{

deflogin(user: String, pass: String) = {

…}

…}

traitUserModule{

case classUser(…) {

def

traitUserModule{

typeUser <: UserLike

traitUserLike{this: User=>

traitMongoUserModule

extendsUserModule{

classUser(…)extendsUserLike

traitLifecycle{

defstartup():Unit

defshutdown():Unit

traitMongoUserModule

extendsUserModule

withLifecycle{

abstract

override

defstartup() {

traitSystemModule{

valuserModule:UserModule

defdoStuff() = {userModule.makeUsers()userModule.encourageMemes()

// ???

traitSystemModule{

defdoStuff(userModule: UserModule) = {userModule.makeUsers()userModule.encourageMemes()

// ???userModule.profit()}}

traitStorageModule{

defstore(id:Long, data: ByteBuffer)

defretrieve(id:Long): ByteBuffer}

// curse you, naming conventions!traitUserModuleModule

extendsStorageModule{

traitUserModule{

typeUser <: UserLike

…}}trait

Now werun

traitA{

valfoo:String}traitB

extendsA{

traitA{

deffoo:String}traitB

extendsA{

traitA{

objectstuff{

objectFoo

objectBar

objectBaz

traitA{

objectstuff{

valFoo

valBar

valBaz