- Web Server: Play (framework) or http4s (library)
- Actors: akka
- Asynchronous Programming: monix (for tasks, reactors, observables, scheduler etc)
- Authentication: Silhouette
- Authorization: Deadbolt
- Command-line option parsing: case-app
- CSV Parsing: kantan.csv
- DB: doobie (for PostgreSQL)
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
import java.nio.charset.{ Charset, StandardCharsets } | |
import org.apache.spark.sql._ | |
import org.apache.spark.sql.types._ | |
object SparkDataLoad { | |
def fromCsv[A : Encoder]( | |
path: Set[String], | |
encoding: Charset = StandardCharsets.UTF_8, | |
useHeader: Boolean = false, |
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
import shapeless._, syntax.singleton._, record._, ops.hlist._ | |
/** | |
* Given an instance A and it's generic representation AR and function f from AR => BR | |
* we can covert A to B if we also have the generic representation of BR as B | |
* We also handle misalignments using shapeless's align typeclass (https://stackoverflow.com/questions/29242873/shapeless-turn-a-case-class-into-another-with-fields-in-different-order) | |
*/ | |
case class Morph[A, AR](a: A)(implicit reprA: LabelledGeneric.Aux[A, AR]) { | |
// Why this DSL you say? Hack to get around scalac idiocy: https://stackoverflow.com/a/46614684/471136 | |
def to[B] = new { |
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
import scala.util.control.NonFatal | |
import better.files.Scanner.Read | |
/** | |
* Extend this trait to create your application config | |
* | |
* Pros of this approach: | |
* 1) Library free approach - only 15 lines of dependency free "library" (four one-line defs for you to override) | |
* 2) Failures happen when the Config object is loaded instead of when a config value is accessed | |
* 3) Strongly typed |
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
import java.io.InputStream | |
import better.files._ | |
import squants.information._, InformationConversions._ | |
object GzipSplitter { | |
/** Splits the $inputstream into approximately equal chunks of $splitSize gzip files under $outputDirectory */ | |
def split( | |
inputStream : InputStream, | |
outputDirectory : File = File.newTemporaryDirectory(), |
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
package com.github.pathikrit.scalgos; | |
import java.util.Map.Entry; | |
import java.util.TreeMap; | |
/** | |
* Efficient data structure to map values to intervals | |
* e.g. set(5, 60000, "hello") would set all keys in [5, 60000) to be "hello" | |
* | |
* All operations are O(log n) (in practice much faster since n is usually number of segments) |
- Let
C<A>
be a higher-kinded type e.g. inList<Animal>
,List
isC
andAnimal
isA
. - Let
S
be a subtype ofT
e.g. inclass Cat extends Animal
,Cat
isS
andAnimal
isT
- If
C<S>
is a subtype ofC<T>
, thenC
is covaraint onT
e.g.List<Cat>
is a subtype ofList<Animal>
- If
C<T>
is a subtype ofC<S>
, thenC
is contravariant onT
e.g.Predicate<Animal>
is a subtype ofPredicate<Cat>
- If neither
C<T>
and norC<S>
are subtypes of the other, thenC
is invariant onT
- If both
C<T>
andC<S>
are subtypes of each other, thenC
is phantom variant onT
. This is possible in languages which support phantom types like Haskell
In Scala:
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
/** Distance between 2 coordinates (in degrees) */ | |
def dist( | |
p1: (Double, Double), // Coordinate 1 (in degrees) | |
p2: (Double, Double), // Coordinate 2 (in degrees) | |
manhattanDist: Boolean = false, // If true, calculate Manhattan distance on the sphere :) | |
diameter: Double = 7917.5 // Diameter of Earth in miles; set this to whatever planet/units you want | |
): Double = { | |
import Math._ | |
def haversine(theta: Double) = (1 - cos(theta))/2 |
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
import java.util.concurrent.TimeUnit | |
import scala.concurrent.duration.Duration | |
import com.google.common.util.concurrent.Monitor | |
class BooleanMonitor(monitor: Monitor = new Monitor())(check: => Boolean) { | |
private val guard = new Monitor.Guard(monitor) { override def isSatisfied = check } | |
def whenSatisfied[U](timeout: Duration = Duration.Inf)(f: => U): U = { |
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
import org.apache.spark.sql.types._ | |
import org.apache.spark.sql._ | |
object SchemaDsl { | |
case class ScalaToSparkType[ScalaType](sparkType: DataType, isNullable: Boolean = false) { | |
def toField(name: String) = StructField(name = name, dataType = sparkType, nullable = isNullable) | |
} | |
implicit val stringType: ScalaToSparkType[String] = ScalaToSparkType(StringType) | |
implicit val intType: ScalaToSparkType[Int] = ScalaToSparkType(IntegerType) |