Commit 9f8bfd71 authored by O'Reilly Media, Inc.'s avatar O'Reilly Media, Inc.
Browse files

Initial commit

parents
Loading
Loading
Loading
Loading
+7 −0
Changes for Best Practices in Scala Programming - Working Files/Chapter 1/No Work Files.rtf: 7 added lines, 0 removed lines.
Original line number Diff line number Diff line
{\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww9000\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural

\f0\fs24 \cf0 No work files for this lesson...}
 No newline at end of file
+47 −0
Changes for Best Practices in Scala Programming - Working Files/Chapter 10/AvoidComplexStructuralTyping.scala: 47 added lines, 0 removed lines.
Original line number Diff line number Diff line
object AvoidComplexStructuralTyping {

  class Foo(val foo : String) {
    def bar() : String = foo
  }

  def myFunction(input : { def bar() : String }) : String = {
    input.bar().toLowerCase
  }

  def myFunction1(input : { def foo : String }) : String = {
    input.foo.toLowerCase
  }

  def myFunction2(input : { def bar() : String; def foo : String}) : String = {
    input.bar().equals(input.foo).toString
  }

  type NewType = { def bar() : String; def foo : String }

  def myFunction3(input : NewType) : String = {
    input.bar().equals(input.foo).toString
  }

  trait MyTrait {
    def bar() : String
    def foo : String
  }

  def myFunction4(input : MyTrait) : String = {
    input.bar().equals(input.foo).toString
  }

  def myFunction5(input : () => String) : String = {
    input().toLowerCase
  }

  def main(args : Array[String]) : Unit = {
    println(myFunction(new Foo("FoO")))
    println(myFunction1(new Foo("FoO")))
    println(myFunction2(new Foo("FoO")))
    println(myFunction3(new Foo("FoO")))
    println(myFunction4(new Foo("FoO") with MyTrait))
    println(myFunction5(new Foo("FoO").bar))
  }

}
+51 −0
Changes for Best Practices in Scala Programming - Working Files/Chapter 10/AvoidDynamicTyping.scala: 51 added lines, 0 removed lines.
Original line number Diff line number Diff line
import scala.language.dynamics

object AvoidDynamicTyping {

  case class URLCall(url : String, arguments : List[String])

  class Resourcer(val methodMapping : Map[Symbol, URLCall]) extends Dynamic {
    def applyDynamicNamed(name : String)(args : (String, Any)*) = methodMapping.get(Symbol(name)) match {
      case Some(URLCall(url, arguments)) => {
        if(!arguments.equals(args.map(_._1))) {
          throw new IllegalArgumentException(s"Invalid arguments, expected $arguments")
        }
        println(
          args.foldLeft(url)((acc, next) => acc.replaceAll(s":${next._1}", next._2.toString))
        )
      }
      case _ => throw new UnsupportedOperationException(s"Invalid method $name")
    }
  }

  def myFunction() : Unit = {
    val r = new Resourcer(Map(
      'queryGoogle -> URLCall("http://www.google.com/?q=:query", List("query")),
      'getUserById -> URLCall("http://www.foo.bar/user/:id", List("id"))
    ))
    r.queryGoogle(query = "foo")
    r.getUserById(id = 1234)
  }

  def myFunction2() : Unit = {
    val r = new Resourcer(Map(
      'getUserById -> URLCall("http://www.foo.bar/user/:id", List("id"))
    ))
    try {
      r.queryGoogle(query = "foo")
    } catch {
      case ex : UnsupportedOperationException => ex.printStackTrace()
    }
    try {
      r.getUserById(ID = 1234)
    } catch {
      case ex : IllegalArgumentException => ex.printStackTrace()
    }
  }

  def main(args : Array[String]) : Unit = {
    //myFunction()
    myFunction2()
  }

}
+66 −0
Changes for Best Practices in Scala Programming - Working Files/Chapter 10/AvoidImplicits.scala: 66 added lines, 0 removed lines.
Original line number Diff line number Diff line
import java.net.URL

object AvoidImplicits {

  object Implicits {
    implicit val myFunction1Context : List[String => String] = List(
      x => x.toLowerCase,
      x => x.trim
    )
    implicit val myFunction1Alternate : List[String => String] = List(
      x => x.toUpperCase
    )
    implicit def stringToURL(str : String) : URL = new URL(str)

    implicit class StringToURLable(str : String) {
      def toURL : URL = new URL(str)
    }
    implicit def queryToURL(query : String) : URL = new URL(s"http://www.google.com/?q=$query")
    implicit class QueryParamToURL(str : String) {
      def toGoogleQueryURL : URL = new URL(s"http://www.google.com/?q=$str")
    }
  }

  def myImplicitParams() : Unit = {
    def _myFunction(str : String)(implicit ctx : List[String => String]) : String = {
      ctx.foldLeft(str)((acc, func) => func(acc))
    }
    //println(_myFunction(" FooO "))

    println("[" + _myFunction(" FooO ")(List(_.toLowerCase, _.trim)) + "]")

    import Implicits.myFunction1Context
    println("[" + _myFunction(" FooO ") + "]")
  }

  def myFunction2() : Unit = {
    def _myFunction(obj : URL) : String = {
      obj.getHost
    }
    println(_myFunction(new URL("http://www.google.com")))

    import Implicits.stringToURL
    println(_myFunction("http://www.google.com"))

    import Implicits.StringToURLable
    println(_myFunction("http://www.google.com".toURL))
  }

  def myFunction3() : Unit = {
    def _myFunction(obj : URL) : String = {
      obj.toString
    }
    println(_myFunction(new URL("http://www.google.com/?q=foo")))
    import Implicits.queryToURL
    println(_myFunction("foo"))
    import Implicits.QueryParamToURL
    println(_myFunction("foo".toGoogleQueryURL))
  }

  def main(args : Array[String]) : Unit = {
    //myImplicitParams()
    //myFunction2()
    myFunction3()
  }

}
+32 −0
Changes for Best Practices in Scala Programming - Working Files/Chapter 10/AvoidPostfixNotation.scala: 32 added lines, 0 removed lines.
Original line number Diff line number Diff line
object AvoidPostfixNotation {

  /*def myFunction() : Unit = {
    var length = 0
    val names = List("foo", "bar", "sha", "baz")

    names toList
    length = names.length

    println(length)
  }*/

  def myFunction() : Unit = {
    val names = List("foo", "bar", "sha", "baz")

    names.map {_.toLowerCase}.filter {_.length > 2}

    names map {_.toLowerCase} filter {_.length > 2}
  }

  def myFunction1() : Unit = {
    val names = List("foo", "bar", "sha", "baz")

    names.map(_.toLowerCase).filter(_.length > 2)
  }

  def main(args : Array[String]) : Unit = {
    myFunction()
    myFunction1()
  }

}
Loading