@@ -161,77 +161,141 @@ module internal BindingData =
161
161
: Dispatch < 'boxedMsg > -> Dispatch < 'boxedMsg > =
162
162
( unboxDispatch boxMsg) >> strongWrapDispatch >> ( boxDispatch unboxMsg)
163
163
164
- let boxBindingData
165
- ( unboxModel : 'boxedModel -> 'model )
164
+ let boxMsg
166
165
( unboxMsg : 'boxedMsg -> 'msg )
167
166
( boxMsg : 'msg -> 'boxedMsg )
168
- : BindingData < 'model , 'msg > -> BindingData < 'boxedModel , 'boxedMsg > = function
169
- | OneWayData d -> OneWayData {
170
- Get = unboxModel >> d.Get
171
- }
172
- | OneWayLazyData d -> OneWayLazyData {
173
- Get = unboxModel >> d.Get
174
- Map = d.Map
175
- Equals = d.Equals
176
- }
177
- | OneWaySeqLazyData d -> OneWaySeqLazyData {
178
- Get = unboxModel >> d.Get
179
- Map = d.Map
180
- Equals = d.Equals
181
- GetId = d.GetId
182
- ItemEquals = d.ItemEquals
183
- }
167
+ : BindingData < 'model , 'msg > -> BindingData < 'model , 'boxedMsg > = function
168
+ | OneWayData d -> d |> OneWayData
169
+ | OneWayLazyData d -> d |> OneWayLazyData
170
+ | OneWaySeqLazyData d -> d |> OneWaySeqLazyData
184
171
| TwoWayData d -> TwoWayData {
185
- Get = unboxModel >> d.Get
186
- Set = fun v m -> d.Set v ( unboxModel m ) |> boxMsg
172
+ Get = d.Get
173
+ Set = fun v m -> d.Set v m |> boxMsg
187
174
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
188
175
}
189
176
| TwoWayValidateData d -> TwoWayValidateData {
190
- Get = unboxModel >> d.Get
191
- Set = fun v m -> d.Set v ( unboxModel m ) |> boxMsg
177
+ Get = d.Get
178
+ Set = fun v m -> d.Set v m |> boxMsg
192
179
Validate = unbox >> d.Validate
193
180
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
194
181
}
195
182
| CmdData d -> CmdData {
196
- Exec = unboxModel >> d.Exec >> ValueOption.map boxMsg
197
- CanExec = unboxModel >> d.CanExec
183
+ Exec = d.Exec >> ValueOption.map boxMsg
184
+ CanExec = d.CanExec
198
185
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
199
186
}
200
187
| CmdParamData d -> CmdParamData {
201
- Exec = fun p m -> d.Exec p ( unboxModel m ) |> ValueOption.map boxMsg
202
- CanExec = fun p m -> d.CanExec p ( unboxModel m )
188
+ Exec = fun p m -> d.Exec p m |> ValueOption.map boxMsg
189
+ CanExec = fun p m -> d.CanExec p m
203
190
AutoRequery = d.AutoRequery
204
191
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
205
192
}
206
193
| SubModelData d -> SubModelData {
207
- GetModel = unboxModel >> d.GetModel
194
+ GetModel = d.GetModel
208
195
GetBindings = d.GetBindings
209
196
ToMsg = d.ToMsg >> boxMsg
210
197
Sticky = d.Sticky
211
198
}
212
199
| SubModelWinData d -> SubModelWinData {
213
- GetState = unboxModel >> d.GetState
200
+ GetState = d.GetState
214
201
GetBindings = d.GetBindings
215
202
ToMsg = d.ToMsg >> boxMsg
216
203
GetWindow =
217
- fun m ( disp : Dispatch < 'boxedMsg >) -> d.GetWindow ( unboxModel m ) ( unboxDispatch boxMsg disp)
204
+ fun m ( disp : Dispatch < 'boxedMsg >) -> d.GetWindow m ( unboxDispatch boxMsg disp)
218
205
IsModal = d.IsModal
219
206
OnCloseRequested = d.OnCloseRequested |> ValueOption.map boxMsg
220
207
}
221
208
| SubModelSeqData d -> SubModelSeqData {
222
- GetModels = unboxModel >> d.GetModels
209
+ GetModels = d.GetModels
223
210
GetId = d.GetId
224
211
GetBindings = d.GetBindings
225
212
ToMsg = d.ToMsg >> boxMsg
226
213
}
227
214
| SubModelSelectedItemData d -> SubModelSelectedItemData {
228
- Get = unboxModel >> d.Get
229
- Set = fun v m -> d.Set v ( unboxModel m ) |> boxMsg
215
+ Get = d.Get
216
+ Set = fun v m -> d.Set v m |> boxMsg
230
217
SubModelSeqBindingName = d.SubModelSeqBindingName
231
218
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
232
219
}
233
220
234
221
222
+ module internal Binding =
223
+
224
+ let mapModel f binding =
225
+ let binaryHelper binary x m = ( x, f m) ||> binary
226
+ let newData =
227
+ match binding.Data with
228
+ | OneWayData d ->
229
+ { Get = f >> d.Get
230
+ } |> OneWayData
231
+ | OneWayLazyData d ->
232
+ { Get = f >> d.Get
233
+ Map = d.Map;
234
+ Equals = d.Equals
235
+ } |> OneWayLazyData
236
+ | OneWaySeqLazyData d ->
237
+ { Get = f >> d.Get
238
+ Map = d.Map
239
+ Equals = d.Equals
240
+ GetId = d.GetId
241
+ ItemEquals = d.ItemEquals
242
+ } |> OneWaySeqLazyData
243
+ | TwoWayData d ->
244
+ { Get = f >> d.Get
245
+ Set = binaryHelper d.Set
246
+ WrapDispatch = d.WrapDispatch
247
+ } |> TwoWayData
248
+ | TwoWayValidateData d ->
249
+ { Get = f >> d.Get
250
+ Set = binaryHelper d.Set
251
+ Validate = f >> d.Validate
252
+ WrapDispatch = d.WrapDispatch
253
+ } |> TwoWayValidateData
254
+ | CmdData d ->
255
+ { Exec = f >> d.Exec
256
+ CanExec = f >> d.CanExec
257
+ WrapDispatch = d.WrapDispatch
258
+ } |> CmdData
259
+ | CmdParamData d ->
260
+ { Exec = binaryHelper d.Exec
261
+ CanExec = binaryHelper d.CanExec
262
+ AutoRequery = d.AutoRequery
263
+ WrapDispatch = d.WrapDispatch
264
+ } |> CmdParamData
265
+ | SubModelData d ->
266
+ { GetModel = f >> d.GetModel
267
+ GetBindings = d.GetBindings
268
+ ToMsg = d.ToMsg
269
+ Sticky = d.Sticky
270
+ } |> SubModelData
271
+ | SubModelWinData d ->
272
+ { GetState = f >> d.GetState
273
+ GetBindings = d.GetBindings
274
+ ToMsg = d.ToMsg
275
+ GetWindow = f >> d.GetWindow
276
+ IsModal = d.IsModal
277
+ OnCloseRequested = d.OnCloseRequested
278
+ } |> SubModelWinData
279
+ | SubModelSeqData d ->
280
+ { GetModels = f >> d.GetModels
281
+ GetId = d.GetId
282
+ GetBindings = d.GetBindings
283
+ ToMsg = d.ToMsg
284
+ } |> SubModelSeqData
285
+ | SubModelSelectedItemData d ->
286
+ { Get = f >> d.Get
287
+ Set = binaryHelper d.Set
288
+ SubModelSeqBindingName = d.SubModelSeqBindingName
289
+ WrapDispatch = d.WrapDispatch
290
+ } |> SubModelSelectedItemData
291
+ { Name = binding.Name; Data = newData }
292
+
293
+
294
+ module internal Bindings =
295
+
296
+ let mapModel f bindings = bindings |> List.map ( Binding.mapModel f)
297
+
298
+
235
299
236
300
[<AutoOpen>]
237
301
module internal Helpers =
@@ -240,9 +304,10 @@ module internal Helpers =
240
304
{ Name = name
241
305
Data = data }
242
306
243
- let boxBinding binding =
307
+ let boxBinding ( binding : Binding < 'a , 'b >) : Binding < obj , obj > =
244
308
{ Name = binding.Name
245
- Data = BindingData.boxBindingData unbox unbox box binding.Data }
309
+ Data = BindingData.boxMsg unbox box binding.Data }
310
+ |> Binding.mapModel unbox
246
311
247
312
248
313
0 commit comments