 
 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()


extension Optional : Decodable /* where Wrapped : Decodable */ {
    public init(from decoder: Decoder) throws {
        // Initialize self here so we can print type(of: self).
        self = .none

        guard Wrapped.self is Decodable.Type else {
            preconditionFailure("\(type(of: self)) does not conform to Decodable because \(Wrapped.self) does not conform to Decodable.")
        }

        let container = try decoder.singleValueContainer()
        if !container.decodeNil() {


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()
