Skip to content

Instantly share code, notes, and snippets.

@mesagie
mesagie / nahman.scala
Created April 12, 2013 12:57
Nahman meuman in Scala
scala> "nahman".reverse.tails.mkString(" ").reverse
// n na nah nahm nahma nahman
@mesagie
mesagie / locally.scala
Last active December 15, 2015 18:28
Restricting the scope of implicits
// a function with non-ambiguous type signature
def justDoIt(implicit p0: Char, p1: String, p2: Int) = p0 + p1 * p2
// restrict the scope of implicits
{
implicit val x = 3
implicit val c = 'a'
implicit val s = "abc"
justDoIt // returns aabcabcabc
}
@mesagie
mesagie / fluentComparison.scala
Last active December 15, 2015 15:49
Fluent indirect comparison
implicit class pimpTuple[T](val tuple: (T, T)) extends AnyVal {
def haveSame(f: (T => Any)) = f(tuple._1) == f(tuple._2)
}
val (sentence1, sentence2) = ("To be or not to be","That is the question")
// Now we can do
(sentence1, sentence2) haveSame (_ split " " size) // false
// Instead of
sentence1.split(" ").size == sentence2.split(" ").size // false
@mesagie
mesagie / gist:5280062
Created March 31, 2013 09:11
It's possible to use the Scala REPL as an advanced shell extension. Here's a simple example of finding the longest file name in a directory from Scala Repl
scala> :sh ls /tmp
res39: scala.tools.nsc.interpreter.ProcessResult = `ls /tmp` (20 lines, exit 0)
scala> res39.lines.maxBy(_.size)
res40: String = homebrew-brew-doctor-4Nsy
@mesagie
mesagie / gist:5169269
Created March 15, 2013 11:33
Protein translation one-liner in Scala
val codonTable = Map (
"UUU" -> "F", "CUU" -> "L", "AUU" -> "I", "GUU" -> "V"
, "UUC" -> "F", "CUC" -> "L", "AUC" -> "I", "GUC" -> "V"
, "UUA" -> "L", "CUA" -> "L", "AUA" -> "I", "GUA" -> "V"
, "UUG" -> "L", "CUG" -> "L", "AUG" -> "M", "GUG" -> "V"
, "UCU" -> "S", "CCU" -> "P", "ACU" -> "T", "GCU" -> "A"
, "UCC" -> "S", "CCC" -> "P", "ACC" -> "T", "GCC" -> "A"
, "UCA" -> "S", "CCA" -> "P", "ACA" -> "T", "GCA" -> "A"
, "UCG" -> "S", "CCG" -> "P", "ACG" -> "T", "GCG" -> "A"
, "UAU" -> "Y", "CAU" -> "H", "AAU" -> "N", "GAU" -> "D"
@mesagie
mesagie / gist:5169230
Created March 15, 2013 11:28
Collection can be applied as functions in Scala
val mirror = (11 to 0 by -1)
mirror map "Barack Obama" mkString //amabO kcaraB
// equivalent to
mirror.map(index => "Barack Obama"(index)) mkString //amabO kcaraB
val shuffle = List(7, 4, 10, 2, 3, 6, 5, 9, 8, 1)
shuffle map "Barack Obama" mkString // Ocmra kaba
@mesagie
mesagie / gist:5150358
Last active December 14, 2015 21:19
Are all members of List a greater than corresponding members of list b.
val a = List(2,3,4)
val b = List(1,2,3)
// O(n^2) and not very elegant.
(0 until a.size) forall (i => a(i) > b(i)) // true
// O(n) but creates tuples and a temporary list. Yet, more elegant.
a zip b forall (x=> x._1 > x._2) // true
// same as above but doesn't create a temporary list (lazy)
@mesagie
mesagie / gist:5132958
Last active December 14, 2015 18:59
Compile-time graph path-finding is possible in Scala
import scala.language.implicitConversions
// Vertices
case class A(l: List[Char])
case class B(l: List[Char])
case class C(l: List[Char])
case class D(l: List[Char])
case class E(l: List[Char])
// Edges
@mesagie
mesagie / gist:5128389
Created March 10, 2013 12:31
Counting occurrences one-liner
scala> "encyclopedia" groupBy identity mapValues (_.size)
res2: scala.collection.immutable.Map[Char,Int] = Map(e -> 2, n -> 1, y -> 1, a -> 1, i -> 1, l -> 1, p -> 1, c -> 2, o -> 1, d -> 1)