     }
   }
 
-  public subscript(key: String) -> JSONValue? {
+  subscript(key: String) -> JSONValue? {
     switch self {
     case let .JSONObject(o): return o[key]
     default: return .None

    return keys.reduce(self) { $0?[$1] }
  }

  public static func map<A where A: JSONDecodable, A == A.DecodedType>(value: JSONValue) -> [A]? {
    switch value {
    case let .JSONArray(a):
      return a.reduce([]) { curry(+) <^> $0 <*> (pure <^> A.decode($1)) }
    default: return .None
    }
  }
}

extension JSONValue: Printable {

    }
  }

  static func map<A where A: JSONDecodable, A == A.DecodedType>(value: JSONValue) -> [A]? {
    switch value {
    case let .JSONArray(a):
      return a.reduce([]) { curry(+) <^> $0 <*> (pure <^> A.decode($1)) }
    default: return .None
    }
  }
}

public extension JSONValue {
  func value<A>() -> A? {
    switch self {
    case let .JSONString(v): return v as? A
    case let .JSONNumber(v): return v as? A
