Skip to content

Commit 4452a1d

Browse files
authored
Merge pull request #212 from bender2k14/add_Bindings.mapModel
Add Bindings.mapModel
2 parents d64e9b7 + 176bb3a commit 4452a1d

File tree

1 file changed

+99
-34
lines changed

1 file changed

+99
-34
lines changed

src/Elmish.WPF/Binding.fs

+99-34
Original file line numberDiff line numberDiff line change
@@ -161,77 +161,141 @@ module internal BindingData =
161161
: Dispatch<'boxedMsg> -> Dispatch<'boxedMsg> =
162162
(unboxDispatch boxMsg) >> strongWrapDispatch >> (boxDispatch unboxMsg)
163163

164-
let boxBindingData
165-
(unboxModel: 'boxedModel -> 'model)
164+
let boxMsg
166165
(unboxMsg: 'boxedMsg -> 'msg)
167166
(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
184171
| 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
187174
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
188175
}
189176
| 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
192179
Validate = unbox >> d.Validate
193180
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
194181
}
195182
| 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
198185
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
199186
}
200187
| 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
203190
AutoRequery = d.AutoRequery
204191
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
205192
}
206193
| SubModelData d -> SubModelData {
207-
GetModel = unboxModel >> d.GetModel
194+
GetModel = d.GetModel
208195
GetBindings = d.GetBindings
209196
ToMsg = d.ToMsg >> boxMsg
210197
Sticky = d.Sticky
211198
}
212199
| SubModelWinData d -> SubModelWinData {
213-
GetState = unboxModel >> d.GetState
200+
GetState = d.GetState
214201
GetBindings = d.GetBindings
215202
ToMsg = d.ToMsg >> boxMsg
216203
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)
218205
IsModal = d.IsModal
219206
OnCloseRequested = d.OnCloseRequested |> ValueOption.map boxMsg
220207
}
221208
| SubModelSeqData d -> SubModelSeqData {
222-
GetModels = unboxModel >> d.GetModels
209+
GetModels = d.GetModels
223210
GetId = d.GetId
224211
GetBindings = d.GetBindings
225212
ToMsg = d.ToMsg >> boxMsg
226213
}
227214
| 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
230217
SubModelSeqBindingName = d.SubModelSeqBindingName
231218
WrapDispatch = boxWrapDispatch unboxMsg boxMsg d.WrapDispatch
232219
}
233220

234221

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+
235299

236300
[<AutoOpen>]
237301
module internal Helpers =
@@ -240,9 +304,10 @@ module internal Helpers =
240304
{ Name = name
241305
Data = data }
242306

243-
let boxBinding binding =
307+
let boxBinding (binding: Binding<'a, 'b>) : Binding<obj, obj> =
244308
{ Name = binding.Name
245-
Data = BindingData.boxBindingData unbox unbox box binding.Data }
309+
Data = BindingData.boxMsg unbox box binding.Data }
310+
|> Binding.mapModel unbox
246311

247312

248313

0 commit comments

Comments
 (0)