Directory structure:
└── packtpublishing-scala-programming-projects/
├── README.md
├── LICENSE
├── Chapter01/
│ ├── build.sbt
│ ├── project/
│ │ ├── build.properties
│ │ └── plugins.sbt
│ └── src/
│ ├── main/
│ │ └── scala/
│ │ ├── Main.scala
│ │ └── Person.scala
│ └── test/
│ └── scala/
│ └── MainSpec.scala
├── Chapter02/
│ └── retirement-calculator/
│ ├── build.sbt
│ ├── project/
│ │ ├── assembly.sbt
│ │ └── build.properties
│ └── src/
│ ├── main/
│ │ ├── resources/
│ │ │ ├── cpi.tsv
│ │ │ └── sp500.tsv
│ │ └── scala/
│ │ └── retcalc/
│ │ ├── EquityData.scala
│ │ ├── InflationData.scala
│ │ ├── RetCalc.scala
│ │ ├── Returns.scala
│ │ └── SimulatePlanApp.scala
│ └── test/
│ ├── resources/
│ │ ├── chapter3_validated.txt
│ │ ├── cpi_2017.tsv
│ │ └── sp500_2017.tsv
│ └── scala/
│ └── retcalc/
│ ├── EquityDataSpec.scala
│ ├── InflationDataSpec.scala
│ ├── RetCalcIT.scala
│ ├── RetCalcSpec.scala
│ ├── ReturnsSpec.scala
│ └── SimulatePlanAppIT.scala
├── Chapter03/
│ ├── retirement-calculator/
│ │ ├── build.sbt
│ │ ├── project/
│ │ │ ├── assembly.sbt
│ │ │ └── build.properties
│ │ └── src/
│ │ ├── main/
│ │ │ ├── resources/
│ │ │ │ ├── cpi.tsv
│ │ │ │ └── sp500.tsv
│ │ │ └── scala/
│ │ │ └── retcalc/
│ │ │ ├── EquityData.scala
│ │ │ ├── InflationData.scala
│ │ │ ├── RetCalc.scala
│ │ │ ├── RetCalcError.scala
│ │ │ ├── Returns.scala
│ │ │ └── SimulatePlanApp.scala
│ │ └── test/
│ │ ├── resources/
│ │ │ ├── cpi_2017.tsv
│ │ │ └── sp500_2017.tsv
│ │ └── scala/
│ │ └── retcalc/
│ │ ├── EquityDataSpec.scala
│ │ ├── InflationDataSpec.scala
│ │ ├── RetCalcIT.scala
│ │ ├── RetCalcSpec.scala
│ │ ├── ReturnsSpec.scala
│ │ └── SimulatePlanAppIT.scala
│ └── worksheets/
│ ├── build.sbt
│ ├── project/
│ │ └── build.properties
│ └── src/
│ └── test/
│ └── scala/
│ ├── either.sc
│ ├── exceptions.sc
│ ├── nonemptylist.sc
│ ├── option.sc
│ ├── referential_transparency.sc
│ └── validated.sc
├── Chapter04/
│ ├── build.sbt
│ ├── project/
│ │ └── build.properties
│ └── src/
│ └── main/
│ └── scala/
│ ├── currying.sc
│ ├── implicits_appContext.sc
│ ├── implicits_conversion.sc
│ ├── implicits_future.sc
│ ├── implicits_parameter.sc
│ ├── implicits_resolution.sc
│ ├── implicits_sdk.sc
│ ├── lazyness.sc
│ └── variance.sc
├── Chapter05/
│ ├── build.sbt
│ ├── project/
│ │ └── build.properties
│ └── src/
│ ├── main/
│ │ └── scala/
│ │ ├── typeclasses.sc
│ │ ├── typeclasses_applicative.sc
│ │ ├── typeclasses_apply.sc
│ │ ├── typeclasses_functor.sc
│ │ ├── typeclasses_monad.sc
│ │ ├── typeclasses_monoid.sc
│ │ ├── typeclasses_monoid_monad.sc
│ │ ├── typeclasses_ordering.sc
│ │ └── typeclasses_semigroup.sc
│ └── test/
│ └── scala/
│ └── EqualitySpec.scala
├── Chapter06-09/
│ └── online-shoppping-cart/
│ ├── README.md
│ ├── build.sbt
│ ├── Future.sc
│ ├── Procfile
│ ├── client/
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── io/
│ │ └── fscala/
│ │ └── shopping/
│ │ └── client/
│ │ ├── CartDiv.scala
│ │ ├── NotifyJS.scala
│ │ ├── ProductDiv.scala
│ │ └── UIManager.scala
│ ├── project/
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── server/
│ │ ├── JSON.sc
│ │ ├── app/
│ │ │ ├── actors/
│ │ │ │ ├── BrowserActor.scala
│ │ │ │ ├── BrowserManagerActor.scala
│ │ │ │ └── UserActor.scala
│ │ │ ├── controllers/
│ │ │ │ ├── Application.scala
│ │ │ │ ├── WebServices.scala
│ │ │ │ └── WebSockets.scala
│ │ │ ├── dao/
│ │ │ │ └── ProductDao.scala
│ │ │ └── views/
│ │ │ └── index.scala.html
│ │ ├── conf/
│ │ │ ├── application.conf
│ │ │ ├── heroku.conf
│ │ │ ├── logback.xml
│ │ │ ├── routes
│ │ │ └── evolutions/
│ │ │ └── default/
│ │ │ └── 1.sql
│ │ └── test/
│ │ ├── APISpec.scala
│ │ ├── ApplicationSpec.scala
│ │ ├── CartDaoSpec.scala
│ │ ├── IntegrationSpec.scala
│ │ └── ProductDaoSpec.scala
│ └── shared/
│ └── src/
│ └── main/
│ └── scala/
│ └── io/
│ └── fscala/
│ └── shopping/
│ └── shared/
│ ├── Models.scala
│ └── SharedMessages.scala
└── Chapter10-11/
└── bitcoin-analyser/
├── build.sbt
├── INSTRUCTIONS.md
├── data/
│ └── transactions/
│ ├── date=2018-09-09/
│ │ ├── part-00000-30a257ae-4520-470a-9420-ffa01e20168d.c000.snappy.parquet
│ │ ├── part-00000-7f73adb4-dfcb-40db-aa98-c204ad92f9d2.c000.snappy.parquet
│ │ ├── part-00000-a943c9fe-fca2-4800-8cf5-a70e01eee675.c000.snappy.parquet
│ │ ├── part-00000-bf9386d0-bdab-496e-a0cc-1d3a76efb128.c000.snappy.parquet
│ │ ├── part-00000-d29d29dc-5109-46b9-a93e-d82a8e81b023.c000.snappy.parquet
│ │ ├── .part-00000-30a257ae-4520-470a-9420-ffa01e20168d.c000.snappy.parquet.crc
│ │ ├── .part-00000-7f73adb4-dfcb-40db-aa98-c204ad92f9d2.c000.snappy.parquet.crc
│ │ ├── .part-00000-a943c9fe-fca2-4800-8cf5-a70e01eee675.c000.snappy.parquet.crc
│ │ ├── .part-00000-b37c5aa1-30bd-4802-8457-75cad399e126.c000.snappy.parquet.crc
│ │ ├── .part-00000-bf9386d0-bdab-496e-a0cc-1d3a76efb128.c000.snappy.parquet.crc
│ │ └── .part-00000-d29d29dc-5109-46b9-a93e-d82a8e81b023.c000.snappy.parquet.crc
│ └── date=2018-09-10/
│ ├── part-00000-4c1b87e4-d129-4a65-97e0-d6d9b6a79442.c000.snappy.parquet
│ ├── part-00000-626a9f68-9c4a-43f6-93bf-23022ab2255f.c000.snappy.parquet
│ ├── .part-00000-4c1b87e4-d129-4a65-97e0-d6d9b6a79442.c000.snappy.parquet.crc
│ ├── .part-00000-626a9f68-9c4a-43f6-93bf-23022ab2255f.c000.snappy.parquet.crc
│ └── .part-00000-67f22d39-b93c-42c0-9197-9890604b4ea4.c000.snappy.parquet.crc
├── project/
│ ├── assembly.sbt
│ └── build.properties
└── src/
├── main/
│ ├── resources/
│ │ └── log4j.properties
│ └── scala/
│ └── coinyser/
│ ├── AppConfig.scala
│ ├── BatchProducer.scala
│ ├── BatchProducerApp.scala
│ ├── HttpTransaction.scala
│ ├── KafkaConfig.scala
│ ├── notebook-batch.sc
│ ├── notebook-streaming.sc
│ ├── StreamingConsumer.scala
│ ├── StreamingProducer.scala
│ ├── Transaction.scala
│ └── WebsocketTransaction.scala
└── test/
└── scala/
└── coinyser/
├── BatchProducerAppIntelliJ.scala
├── BatchProducerIT.scala
├── BatchProducerSpec.scala
├── FakePusher.scala
├── pusher-subscribe.sc
├── StreamingConsumerApp.scala
├── StreamingConsumerSpec.scala
├── StreamingProducerApp.scala
└── StreamingProducerSpec.scala