 
 public extension GAP {
     
+    /// GAP Data Decoder
     public typealias DataEncoder = GAPDataEncoder
-}
-
+    
+    /// GAP Data Decoder
+    public typealias DataDecoder = GAPDataDecoder
+}
+
+/// GAP Data Decoder
 public struct GAPDataEncoder {
     
+    /// GAP Data Decoder Error
     public enum Error: Swift.Error {
         
+        /// Invalid data size.
         case invalidSize(Int)
     }
     
+    // MARK: - Initialization
+    
+    /// Initialize encoder.
     public init() { }
+    
+    // MARK: - Methods
     
     public func encode(_ encodables: GAPData...) -> Data {
         

                value = Data()
            }
            
            if let gapType = types.first(where: { $0.dataType == type }) {
                
                guard let decodable = gapType.init(data: value)
                    else { throw Error.cannotDecode(type, index: index) }

        case unknownType(GAPDataType)
    }
    
    // MARK: - Initialization
    
    /// Initialize with default data types.
    public init() {
        
        /// initialize with default precomputed values
        self.types = GAPDataDecoder.defaultTypes
        self.dataTypes = GAPDataDecoder.defaultDataTypes
    }
    
    // MARK: - Properties
    
    public var ignoreUnknownType: Bool = false
    
    public var types = [GAPData.Type]() {
        didSet {
            dataTypes = [GAPDataType: GAPData.Type](minimumCapacity: types.count)
            types.forEach { dataTypes[$0.dataType] = $0 }
        }
    }
    
    internal private(set) var dataTypes: [GAPDataType: GAPData.Type] = [:]
    
    // MARK: - Methods
    
    public func decode(_ data: LowEnergyAdvertisingData) throws -> [GAPData] {
        
