package scalaz

sealed trait Alpha {
  val toChar: Char

  def toUpperChar: Char = toChar.toUpper

  override def equals(o: Any): Boolean = o != null && o.isInstanceOf[Alpha] && o.asInstanceOf[Alpha].toChar == toChar

  override def hashCode: Int = toChar.hashCode

  override def toString: String = toChar.toString
}

object Alpha {
  case object A extends Alpha {
    val toChar = 'a'
  }
  case object B extends Alpha {
    val toChar = 'b'
  }
  case object C extends Alpha {
    val toChar = 'c'
  }
  case object D extends Alpha {
    val toChar = 'd'
  }
  case object E extends Alpha {
    val toChar = 'e'
  }
  case object F extends Alpha {
    val toChar = 'f'
  }
  case object G extends Alpha {
    val toChar = 'g'
  }
  case object H extends Alpha {
    val toChar = 'h'
  }
  case object I extends Alpha {
    val toChar = 'i'
  }
  case object J extends Alpha {
    val toChar = 'j'
  }
  case object K extends Alpha {
    val toChar = 'k'
  }
  case object L extends Alpha {
    val toChar = 'l'
  }
  case object M extends Alpha {
    val toChar = 'm'
  }
  case object N extends Alpha {
    val toChar = 'n'
  }
  case object O extends Alpha {
    val toChar = 'o'
  }
  case object P extends Alpha {
    val toChar = 'p'
  }
  case object Q extends Alpha {
    val toChar = 'q'
  }
  case object R extends Alpha {
    val toChar = 'r'
  }
  case object S extends Alpha {
    val toChar = 's'
  }
  case object T extends Alpha {
    val toChar = 't'
  }
  case object U extends Alpha {
    val toChar = 'u'
  }
  case object V extends Alpha {
    val toChar = 'v'
  }
  case object W extends Alpha {
    val toChar = 'w'
  }
  case object X extends Alpha {
    val toChar = 'x'
  }
  case object Y extends Alpha {
    val toChar = 'y'
  }
  case object Z extends Alpha {
    val toChar = 'z'
  }
}

trait Alphas {
  import Alpha._
  
  val alphas: List[Alpha] = List(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z)

  implicit def AlphaChar(a: Alpha): Char = a.toChar
}