@@ -11,7 +11,7 @@ extension Array: ScaleContainerEncodable {
11
11
public typealias EElement = Element
12
12
13
13
public func encode( in encoder: ScaleEncoder , writer: @escaping ( EElement , ScaleEncoder ) throws -> Void ) throws {
14
- try encoder. encode ( compact : UInt32 ( count) )
14
+ try encoder. encode ( UInt32 ( count) , . compact )
15
15
for element in self {
16
16
try writer ( element, encoder)
17
17
}
@@ -36,96 +36,77 @@ extension Array: ScaleEncodable where Element: ScaleEncodable {}
36
36
37
37
extension Array : ScaleDecodable where Element: ScaleDecodable { }
38
38
39
- extension ScaleDecoder {
40
- public func decode< T: ScaleDecodable > ( _ type: [ T ] . Type, _ fixed: ScaleFixedTypeMarker ) throws -> [ T ] {
41
- return try self . decode ( fixed)
42
- }
39
+ public protocol ScaleArrayInitializable {
40
+ associatedtype IElement
43
41
44
- public func decode< T> (
45
- _ type: [ T ] . Type, _ fixed: ScaleFixedTypeMarker ,
46
- reader: @escaping ( ScaleDecoder ) throws -> T
47
- ) throws -> [ T ] {
48
- return try self . decode ( fixed, reader: reader)
49
- }
42
+ init ( array: [ IElement ] )
43
+ }
44
+
45
+ extension Array : ScaleArrayInitializable {
46
+ public typealias IElement = Element
50
47
51
- public func decode< T> (
52
- _ fixed: ScaleFixedTypeMarker ,
53
- reader: @escaping ( ScaleDecoder ) throws -> T
54
- ) throws -> [ T ] {
55
- guard case . fixed( let size) = fixed else { fatalError ( ) } // Compiler error silencing.
56
- var values = Array < T > ( )
57
- values. reserveCapacity ( Int ( size) )
58
- for _ in 0 ..< size {
59
- try values. append ( reader ( self ) )
60
- }
61
- return values
48
+ public init ( array: [ IElement ] ) {
49
+ self . init ( array)
62
50
}
51
+ }
52
+
53
+ public protocol ScaleArrayConvertible {
54
+ associatedtype CElement
55
+
56
+ var asArray : [ CElement ] { get }
57
+ }
58
+
59
+ extension Array : ScaleArrayConvertible {
60
+ public typealias CElement = Element
63
61
64
- public func decode< T: ScaleDecodable > ( _ fixed: ScaleFixedTypeMarker ) throws -> [ T ] {
65
- try self . decode ( fixed) { decoder in try decoder. decode ( ) }
62
+ public var asArray : [ CElement ] { return self }
63
+ }
64
+
65
+ extension ScaleCustomDecoderFactory where T: ScaleArrayInitializable , T. IElement: ScaleDecodable {
66
+ public static func fixed( _ size: UInt ) -> ScaleCustomDecoderFactory {
67
+ . fixed( size) { decoder in try decoder. decode ( ) }
66
68
}
67
69
}
68
70
69
- extension ScaleEncoder {
70
- @discardableResult
71
- public func encode< T: ScaleEncodable > ( _ values: [ T ] , fixed: UInt ) throws -> ScaleEncoder {
72
- try self . encode ( values, fixed: fixed) { val, enc in try enc. encode ( val) }
73
- return self
71
+ extension ScaleCustomDecoderFactory where T: ScaleArrayInitializable {
72
+ public static func fixed(
73
+ _ size: UInt , _ reader: @escaping ( ScaleDecoder ) throws -> T . IElement
74
+ ) -> ScaleCustomDecoderFactory {
75
+ ScaleCustomDecoderFactory { decoder in
76
+ var values = Array < T . IElement > ( )
77
+ values. reserveCapacity ( Int ( size) )
78
+ for _ in 0 ..< size {
79
+ try values. append ( reader ( decoder) )
80
+ }
81
+ return T ( array: values)
82
+ }
74
83
}
75
-
76
- @discardableResult
77
- public func encode< T> (
78
- _ values: [ T ] , fixed: UInt ,
79
- writer: @escaping ( T , ScaleEncoder ) throws -> Void
80
- ) throws -> ScaleEncoder {
81
- guard values. count == fixed else {
82
- throw SEncodingError . invalidValue (
83
- values, SEncodingError . Context (
84
- path: self . path,
85
- description: " Wrong value count \( values. count) expected \( fixed) "
84
+ }
85
+
86
+ extension ScaleCustomEncoderFactory where T: ScaleArrayConvertible {
87
+ public static func fixed(
88
+ _ size: UInt , writer: @escaping ( T . CElement , ScaleEncoder ) throws -> Void
89
+ ) -> ScaleCustomEncoderFactory {
90
+ ScaleCustomEncoderFactory { encoder, conv in
91
+ let values = conv. asArray
92
+ guard values. count == size else {
93
+ throw SEncodingError . invalidValue (
94
+ values, SEncodingError . Context (
95
+ path: encoder. path,
96
+ description: " Wrong value count \( values. count) expected \( size) "
97
+ )
86
98
)
87
- )
88
- }
89
- for val in values {
90
- try writer ( val, self )
99
+ }
100
+ for val in values {
101
+ try writer ( val, encoder)
102
+ }
103
+ return encoder
91
104
}
92
- return self
93
105
}
94
106
}
95
107
96
- extension SCALE {
97
- public func decode< T: ScaleDecodable > (
98
- _ type: [ T ] . Type, _ fixed: ScaleFixedTypeMarker , from data: Data
99
- ) throws -> [ T ] {
100
- return try self . decode ( fixed, from: data)
101
- }
102
-
103
- public func decode< T> (
104
- _ type: [ T ] . Type, _ fixed: ScaleFixedTypeMarker , from data: Data ,
105
- reader: @escaping ( ScaleDecoder ) throws -> T
106
- ) throws -> [ T ] {
107
- return try self . decode ( fixed, from: data, reader: reader)
108
- }
109
-
110
- public func decode< T: ScaleDecodable > ( _ fixed: ScaleFixedTypeMarker , from data: Data ) throws -> [ T ] {
111
- return try self . decoder ( data: data) . decode ( fixed)
112
- }
113
-
114
- public func decode< T> (
115
- _ fixed: ScaleFixedTypeMarker , from data: Data ,
116
- reader: @escaping ( ScaleDecoder ) throws -> T
117
- ) throws -> [ T ] {
118
- return try self . decoder ( data: data) . decode ( fixed, reader: reader)
119
- }
120
-
121
- public func encode< T: ScaleEncodable > ( _ values: [ T ] , fixed: UInt ) throws -> Data {
122
- return try self . encoder ( ) . encode ( values, fixed: fixed) . output
123
- }
124
-
125
- public func encode< T> (
126
- _ values: [ T ] , fixed: UInt ,
127
- writer: @escaping ( T , ScaleEncoder ) throws -> Void
128
- ) throws -> Data {
129
- return try self . encoder ( ) . encode ( values, fixed: fixed, writer: writer) . output
108
+ extension ScaleCustomEncoderFactory where T: ScaleArrayConvertible , T. CElement: ScaleEncodable {
109
+ public static func fixed( _ size: UInt ) -> ScaleCustomEncoderFactory {
110
+ . fixed( size) { val, enc in try enc. encode ( val) }
130
111
}
131
112
}
0 commit comments