 
 extension Array : Decodable /* where Element : Decodable */ {
     public init(from decoder: Decoder) throws {
-        // Initialize self here so we can print type(of: self).
+        // Initialize self here so we can get type(of: self).
         self.init()
-
-        guard Element.self is Decodable.Type else {
-            preconditionFailure("\(type(of: self)) does not conform to Decodable because \(Element.self) does not conform to Decodable.")
-        }
+        assertTypeIsDecodable(Element.self, in: type(of: self))
 
         let metaType = (Element.self as! Decodable.Type)
         var container = try decoder.unkeyedContainer()

    }
}

//===----------------------------------------------------------------------===//
// Collection Conformances
//===----------------------------------------------------------------------===//

// FIXME: Uncomment when conditional conformance is available.
extension Array : Encodable /* where Element : Encodable */ {
    public func encode(to encoder: Encoder) throws {
        guard Element.self is Encodable.Type else {
            preconditionFailure("\(type(of: self)) does not conform to Encodable because \(Element.self) does not conform to Encodable.")
        }

        var container = encoder.unkeyedContainer()
        for element in self {


extension Set : Decodable /* where Element : Decodable */ {
    public init(from decoder: Decoder) throws {
        // Initialize self here so we can get type(of: self).
        self.init()
        assertTypeIsDecodable(Element.self, in: type(of: self))

        let metaType = (Element.self as! Decodable.Type)
        var container = try decoder.unkeyedContainer()
