Extension for Scala library
import com.github.t3hnar.scalax.StringOption
StringOption(null) // None
StringOption("") // None
StringOption("\t\n\r ") // None
StringOption("nonempty") // Some("nonempty")
StringOption("\t\nnonempty\r ") // Some("nonempty")
import com.github.t3hnar.scalax.RichString
"123".toByteOpt // Some(123)
"1-2-3".toByteOpt // None
"123".toIntOpt // Some(123)
"1-2-3".toIntOpt // None
"123".toLongOpt // Some(123)
"1-2-3".toLongOpt // None
"123".toFloatOpt // Some(123.0)
"1-2-3".toFloatOpt // None
"123".toDoubleOpt // Some(123.0)
"1-2-3".toDoubleOpt // None
"true".toBooleanOpt // Some(true)
"false".toBooleanOpt // Some(false)
"+".toBooleanOpt // Some(true)
"-".toBooleanOpt // Some(false)
"ON".toBooleanOpt // Some(true)
"OFF".toBooleanOpt // Some(false)
"yes".toBooleanOpt // Some(true)
"no".toBooleanOpt // Some(false)
import com.github.t3hnar.scalax.RichAny
(null: Any).asInstanceOfOpt[String] // None
("string": Any).asInstanceOfOpt[String] // Some
Adds withNameOpt
method additionally to default withName
object Color extends Enumeration {
val Green, Blue, Red = Value
}
import com.github.t3hnar.scalax.RichEnum
Color.withNameOpt("Green") // Some(Green)
Color.withNameOpt("Black") // None
Adds collate
method to set. collate
tries to compare sets of items in detail
and returns items which were added, updated (key relative) and deleted in s2
regarding s1
import com.github.t3hnar.scalax.RichSet
case class Entity(id: Int, name: String)
val s1 = Set(Entity(1, "1"), Entity(2, "2"), Entity(3, "3"))
val s2 = Set(Entity(1, "1"), Entity(2, "u"), Entity(4, "4"))
s1.collate(s2)(_.id) // Some(Set(Entity(4, "4")), Set(Entity(2, "u")), Set(3))
import com.github.t3hnar.scalax.RichDuration
import concurrent.duration._
60.seconds.toCoarsest // 1.minute
60.minutes.toCoarsest // 1.hour
180.minutes.toCoarsest // 3.hours
24.hours.toCoarsest // 1.day
Duration.Inf.toCoarsest // Duration.Inf
Duration.MinusInf.toCoarsest // Duration.MinusInf
import com.github.t3hnar.scalax.RichPartialFunction
val pf1: PartialFunction[Int, String] = {
case 0 => "0"
case 1 => "1"
}
val pf2 = pf1.filter(_ == 0)
pf2.isDefinedAt(0) // true
pf2.isDefinedAt(1) // false
import com.github.t3hnar.scalax.RichTry
Try("10".toInt).fold("NumberFormatException for " + _)("Valid int: " + _)
Try("10".toInt).toEither // Right(10)
Try("abc".toInt).toEither // Left(java.lang.NumberFormatException: For input string: "abc")
import com.github.t3hnar.scalax.RichEither
val either: Either[Throwable, Int] = Left(new RuntimeException)
either.toTry // Failure(java.lang.RuntimeException)
val either: Either[Throwable, Int] = Right(1)
either.toTry // Success(1)
import com.github.t3hnar.scalax.RichSetMap
val map = Map(1 -> Set(1))
map.getOrEmpty(1) // Set()
map.updatedSet(1, _ - 1) // Map()
map.updatedSet(1, _ + 2) // Map(1 -> Set(1, 2))
map.updatedSet(2, _ + 2) // Map(1 -> Set(1), 2 -> Set(2))
map.updatedSet(1, _ => Set(1, 2, 3)) // Map(1 -> Set(1, 2, 3))
import com.github.t3hnar.scalax.Primitive
Primitive.unapply(()) // None
Primitive.unapply(true) // Some(true)
Primitive.unapply(' ') // Some( )
Primitive.unapply(1) // Some(1)
Primitive.unapply("") // None
import com.github.t3hnar.scalax.StandardAnyVal
StandardAnyVal.unapply(()) // Some(())
StandardAnyVal.unapply(true) // Some(true)
StandardAnyVal.unapply(' ') // Some( )
StandardAnyVal.unapply(1) // Some(1)
StandardAnyVal.unapply("") // None
import com.github.t3hnar.scalax.RichClass
classOf[Class1].simpleName // Class1
classOf[Class1.Class2].simpleName // Class2
classOf[Class1.Class2.Class3].simpleName // Class3
class Class1
object Class1 {
class Class2
object Class2 {
class Class3
}
}
import com.github.t3hnar.scalax.RichOption
Option(1) orError "option is empty" // 1
Option.empty[Int] orError "option is empty" // java.lang.RuntimeException
import com.github.t3hnar.scalax.util.ExpiringCache
val cache = new ExpiringCache[Int, Int](duration = 5,
unit = TimeUnit.SECONDS,
queryOverflow = 3)
cache.put(0,0)
cache.get(0) // Some(0)
// after 5 seconds
cache.get(0) // None, however it is not cleaned up yet, need one more query to go
cache.get(0) // None, now it's cleaned up as we reached `queryOverflow` limit