package scalaz
package http
import Scalaz._
import java.lang.Character.isDigit
sealed trait Version {
val major: Digit
val minor: Digit
def asString = "HTTP/" + major.toInt + "." + minor.toInt
}
trait Versions {
implicit def VersionString(v: Version) = v.asString
implicit def ListVersion: (List[Char] => Option[Version]) = StringVersion _ compose (_.mkString)
implicit def StringVersion(s: String): Option[Version] =
if (s.length < 8)
None
else {
val major = s charAt 5
val minor = s charAt 7
List(major, minor) ↦ ((c: Char) => isDigit(c).option(c.toLong - 48L)) map {case List(maj, min) => Version.version(maj, min)}
}
}
object Version extends Versions {
def unapply(v: Version): Option[(Digit, Digit)] =
Some(v.major, v.minor)
def version(maj: Digit, min: Digit): Version = new Version {
val major = maj
val minor = min
}
import Digit._
val version10 = version(_1, _0)
val version11 = version(_1, _1)
}