@@ -88,14 +88,45 @@ extension DynamicProperty {
88
88
}
89
89
90
90
extension BodyAccessor {
91
- func makeBody( container: _GraphValue < Container > , inputs: inout _GraphInputs , fields: DynamicPropertyCache . Fields ) -> ( _GraphValue < Body > , _DynamicPropertyBuffer ? ) {
91
+ func makeBody(
92
+ container: _GraphValue < Container > ,
93
+ inputs: inout _GraphInputs ,
94
+ fields: DynamicPropertyCache . Fields
95
+ ) -> ( _GraphValue < Body > , _DynamicPropertyBuffer ? ) {
92
96
guard Body . self != Never . self else {
93
97
fatalError ( " \( Body . self) may not have Body == Never " )
94
98
}
95
- withUnsafeMutablePointer ( to: & inputs) { inputs in
96
- // TODO
99
+ return withUnsafeMutablePointer ( to: & inputs) { inputsPointer in
100
+ func project< Flags: RuleThreadFlags > ( flags: Flags . Type ) -> ( _GraphValue < Body > , _DynamicPropertyBuffer ? ) {
101
+ let buffer = _DynamicPropertyBuffer (
102
+ fields: fields,
103
+ container: container,
104
+ inputs: & inputsPointer. pointee
105
+ )
106
+ if buffer. _count == 0 {
107
+ buffer. destroy ( )
108
+ let body = StaticBody < Self , Flags > (
109
+ accessor: self ,
110
+ container: container. value
111
+ )
112
+ return ( _GraphValue ( body) , nil )
113
+ } else {
114
+ let body = DynamicBody < Self , Flags > (
115
+ accessor: self ,
116
+ container: container. value,
117
+ phase: inputsPointer. pointee. phase,
118
+ links: buffer,
119
+ resetSeed: 0
120
+ )
121
+ return ( _GraphValue ( body) , buffer)
122
+ }
123
+ }
124
+ if fields. behaviors. contains ( . asyncThread) {
125
+ return project ( flags: AsyncThreadFlags . self)
126
+ } else {
127
+ return project ( flags: MainThreadFlags . self)
128
+ }
97
129
}
98
- fatalError ( " TODO " )
99
130
}
100
131
}
101
132
@@ -167,3 +198,39 @@ extension StaticBody: BodyAccessorRule {
167
198
extension StaticBody : CustomStringConvertible {
168
199
var description : String { " \( Accessor . Body. self) " }
169
200
}
201
+
202
+ // MARK: - DynamicBody
203
+
204
+ // TODO
205
+ private struct DynamicBody < Accessor: BodyAccessor , ThreadFlags: RuleThreadFlags > {
206
+ let accessor : Accessor
207
+ @Attribute
208
+ var container : Accessor . Container
209
+ @Attribute
210
+ var phase : _GraphInputs . Phase
211
+ var links : _DynamicPropertyBuffer
212
+ var resetSeed : UInt32
213
+
214
+ init (
215
+ accessor: Accessor ,
216
+ container: Attribute < Accessor . Container > ,
217
+ phase: Attribute < _GraphInputs . Phase > ,
218
+ links: _DynamicPropertyBuffer ,
219
+ resetSeed: UInt32
220
+ ) {
221
+ fatalError ( " TODO " )
222
+ // self.accessor = accessor
223
+ // self._container = container
224
+ // self._phase = phase
225
+ // self.links = links
226
+ // self.resetSeed = resetSeed
227
+ }
228
+ }
229
+
230
+ extension DynamicBody : StatefulRule {
231
+ typealias Value = Accessor . Body
232
+
233
+ func updateValue( ) {
234
+ // TODO
235
+ }
236
+ }
0 commit comments