


/****************************************************************/
/**** PA6 Prelude: Case Classes *********************************/ 
/****************************************************************/

sealed abstract class JVal {
  override def toString : String = 
    this match {
      case JStr(s) => "\"%s\"".format(s)
      
      case JNum(n) => n.toString 

      case JObj(m) => m.toList
                       .map(p => p._1 + " : " + p._2.toString)
                       .mkString("{", ", ", "}")

      case JArr(a) => a.map(_.toString)
                       .mkString("{", ", ", "}")
    }
}

case class JStr(s: String)            extends JVal
case class JNum(n: BigDecimal)        extends JVal
case class JObj(o: Map[String, JVal]) extends JVal
case class JArr(a: List[JVal])        extends JVal

/****************************************************************/
/**** PA6 Prelude: Case Classes *********************************/ 
/****************************************************************/

sealed abstract class Bag[A]
case class Empty[A] extends Bag[A]
case class Plus[A](elt: A, rest: Bag[A]) extends Bag[A]



