Advertisement
eallik

Untitled

Apr 7th, 2014
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.28 KB | None | 0 0
  1. object timeunits extends App {
  2.   // sealed trait + N * case (class|object) == ADT
  3.  
  4.   sealed trait Timeunit
  5.   case class Millis (x: Long) extends Timeunit
  6.   case class Seconds(x: Long) extends Timeunit
  7.   case class Minutes(x: Long) extends Timeunit
  8.   case class Hours  (x: Long) extends Timeunit
  9.  
  10.   implicit class DotComposition[R, T1](f: T1 => R) {
  11.     def[A](g: A => T1) = f compose g
  12.   }
  13.  
  14.   def inMillis  = identity(_: Long)
  15.   def inSeconds = inMillis  ∘ ((_: Long) * 1000)
  16.   def inMinutes = inSeconds ∘ ((_: Long) * 60)
  17.   def inHours   = inMinutes ∘ ((_: Long) * 60)
  18.  
  19.   def toMillis = (_: Timeunit) match {
  20.     case Millis(x)  => inMillis(x)
  21.     case Seconds(x) => inSeconds(x)
  22.     case Minutes(x) => inMinutes(x)
  23.     case Hours(x)   => inHours(x)
  24.   }
  25.  
  26.   // reaalselt kasutuses
  27.   implicit class LongWithTimeunits(x: Long) {
  28.     def millis  = Millis(x);  def milli  = millis
  29.     def seconds = Seconds(x); def second = seconds
  30.     def minutes = Minutes(x); def minute = minutes
  31.     def hours   = Hours(x);   def hour   = hours
  32.   }
  33.  
  34.   def sleep1(t: Timeunit) = Thread.sleep(toMillis(t))
  35.   sleep1(2.seconds)
  36.  
  37.   // üks võimalik vaste Haskelli versioonile
  38.   def sleep2(t: Long, unit: Long => Timeunit) = Thread.sleep(toMillis(unit(t)))
  39.   sleep2(500, Millis)
  40. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement