Skip to content

Commit

Permalink
Add 'a and 'vm types for underlying types
Browse files Browse the repository at this point in the history
  • Loading branch information
marner2 committed Jun 4, 2022
1 parent f061b6e commit 6679f76
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 102 deletions.
78 changes: 39 additions & 39 deletions src/Elmish.WPF/BindingInternal.fs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ type internal OneWayToSourceData<'model, 'msg, 'a> =
{ Set: 'a -> 'model -> 'msg }


type internal OneWaySeqLazyData<'model, 'a, 'b, 'id when 'id : equality> =
type internal OneWaySeqLazyData<'model, 'a, 'b, 'vm, 'id when 'id : equality> =
{ Get: 'model -> 'a
Map: 'a -> 'b seq
CreateCollection: 'b seq -> CollectionTarget<'b>
Expand Down Expand Up @@ -45,7 +45,7 @@ type internal CmdData<'model, 'msg> = {
}


type internal SubModelSelectedItemData<'model, 'msg, 'id> =
type internal SubModelSelectedItemData<'model, 'msg, 'vm, 'id> =
{ Get: 'model -> 'id voption
Set: 'id voption -> 'model -> 'msg
SubModelSeqBindingName: string }
Expand All @@ -70,15 +70,15 @@ and internal SubModelWinData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingV
}


and internal SubModelSeqUnkeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel> =
and internal SubModelSeqUnkeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel, 'vmCollection> =
{ GetModels: 'model -> 'bindingModel seq
CreateViewModel: ViewModelArgs<'bindingModel,'bindingMsg> -> 'bindingViewModel
CreateCollection: 'bindingViewModel seq -> CollectionTarget<'bindingViewModel>
UpdateViewModel: 'bindingViewModel * 'bindingModel -> unit
ToMsg: 'model -> int * 'bindingMsg -> 'msg }


and internal SubModelSeqKeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel, 'id when 'id : equality> =
and internal SubModelSeqKeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel, 'vmCollection, 'id when 'id : equality> =
{ GetSubModels: 'model -> 'bindingModel seq
CreateViewModel: ViewModelArgs<'bindingModel,'bindingMsg> -> 'bindingViewModel
CreateCollection: 'bindingViewModel seq -> CollectionTarget<'bindingViewModel>
Expand All @@ -97,18 +97,18 @@ and internal SubModelSeqKeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bin
Merge.keyed d.GetId (getTargetId d.GetId) create update values newSubModels


and internal ValidationData<'model, 'msg> =
{ BindingData: BindingData<'model, 'msg>
and internal ValidationData<'model, 'msg, 'a> =
{ BindingData: BindingData<'model, 'msg, 'a>
Validate: 'model -> string list }


and internal LazyData<'model, 'msg> =
{ BindingData: BindingData<'model, 'msg>
and internal LazyData<'model, 'msg, 'a> =
{ BindingData: BindingData<'model, 'msg, 'a>
Equals: 'model -> 'model -> bool }


and internal AlterMsgStreamData<'model, 'msg, 'bindingModel, 'bindingMsg, 'dispatchMsg> =
{ BindingData: BindingData<'bindingModel, 'bindingMsg>
and internal AlterMsgStreamData<'model, 'msg, 'bindingModel, 'bindingMsg, 'dispatchMsg, 'a> =
{ BindingData: BindingData<'bindingModel, 'bindingMsg, 'a>
AlterMsgStream: ('dispatchMsg -> unit) -> 'bindingMsg -> unit
Get: 'model -> 'bindingModel
Set: 'dispatchMsg -> 'model -> 'msg }
Expand All @@ -121,32 +121,32 @@ and internal AlterMsgStreamData<'model, 'msg, 'bindingModel, 'bindingMsg, 'dispa
this.AlterMsgStream dispatch'


and internal BaseBindingData<'model, 'msg> =
| OneWayData of OneWayData<'model, obj>
| OneWayToSourceData of OneWayToSourceData<'model, 'msg, obj>
| OneWaySeqLazyData of OneWaySeqLazyData<'model, obj, obj, obj>
| TwoWayData of TwoWayData<'model, 'msg, obj>
and internal BaseBindingData<'model, 'msg, 'a> =
| OneWayData of OneWayData<'model, 'a>
| OneWayToSourceData of OneWayToSourceData<'model, 'msg, 'a>
| OneWaySeqLazyData of OneWaySeqLazyData<'model, obj, obj, 'a, obj>
| TwoWayData of TwoWayData<'model, 'msg, 'a>
| CmdData of CmdData<'model, 'msg>
| SubModelData of SubModelData<'model, 'msg, obj, obj, obj>
| SubModelWinData of SubModelWinData<'model, 'msg, obj, obj, obj>
| SubModelSeqUnkeyedData of SubModelSeqUnkeyedData<'model, 'msg, obj, obj, obj>
| SubModelSeqKeyedData of SubModelSeqKeyedData<'model, 'msg, obj, obj, obj, obj>
| SubModelSelectedItemData of SubModelSelectedItemData<'model, 'msg, obj>
| SubModelData of SubModelData<'model, 'msg, obj, obj, 'a>
| SubModelWinData of SubModelWinData<'model, 'msg, obj, obj, 'a>
| SubModelSeqUnkeyedData of SubModelSeqUnkeyedData<'model, 'msg, obj, obj, obj, 'a>
| SubModelSeqKeyedData of SubModelSeqKeyedData<'model, 'msg, obj, obj, obj, 'a, obj>
| SubModelSelectedItemData of SubModelSelectedItemData<'model, 'msg, 'a, obj>


and internal BindingData<'model, 'msg> =
| BaseBindingData of BaseBindingData<'model, 'msg>
| CachingData of BindingData<'model, 'msg>
| ValidationData of ValidationData<'model, 'msg>
| LazyData of LazyData<'model, 'msg>
| AlterMsgStreamData of AlterMsgStreamData<'model, 'msg, obj, obj, obj>
and internal BindingData<'model, 'msg, 'a> =
| BaseBindingData of BaseBindingData<'model, 'msg, 'a>
| CachingData of BindingData<'model, 'msg, 'a>
| ValidationData of ValidationData<'model, 'msg, 'a>
| LazyData of LazyData<'model, 'msg, 'a>
| AlterMsgStreamData of AlterMsgStreamData<'model, 'msg, obj, obj, obj, 'a>


/// Represents all necessary data used to create a binding.
and Binding<'model, 'msg> =
internal
{ Name: string
Data: BindingData<'model, 'msg> }
Data: BindingData<'model, 'msg, obj> }


[<AutoOpen>]
Expand Down Expand Up @@ -321,8 +321,8 @@ module internal BindingData =
let addLazy equals b = { BindingData = b; Equals = equals } |> LazyData
let alterMsgStream
(alteration: ('dispatchMsg -> unit) -> 'bindingMsg -> unit)
(b: BindingData<'bindingModel, 'bindingMsg>)
: BindingData<'model, 'msg> =
(b: BindingData<'bindingModel, 'bindingMsg, 'a>)
: BindingData<'model, 'msg, 'a> =
{ BindingData = b |> mapModel unbox |> mapMsg box
AlterMsgStream =
fun (f: obj -> unit) ->
Expand All @@ -332,7 +332,7 @@ module internal BindingData =
Get = box
Set = fun (dMsg: obj) _ -> unbox dMsg }
|> AlterMsgStreamData
let addSticky (predicate: 'model -> bool) (binding: BindingData<'model, 'msg>) =
let addSticky (predicate: 'model -> bool) (binding: BindingData<'model, 'msg, 'a>) =
let mutable stickyModel = None
let f newModel =
if predicate newModel then
Expand Down Expand Up @@ -415,7 +415,7 @@ module internal BindingData =
(outMapId: 'id -> 'id0)
(inMapA: 'a0 -> 'a)
(inMapB: 'b0 -> 'b)
(d: OneWaySeqLazyData<'model, 'a, 'b, 'id>) = {
(d: OneWaySeqLazyData<'model, 'a, 'b, 'vm, 'id>) = {
Get = d.Get >> outMapA
Map = inMapA >> d.Map >> Seq.map outMapB
CreateCollection = Seq.map inMapB >> d.CreateCollection >> CollectionTarget.map outMapB inMapB
Expand Down Expand Up @@ -444,7 +444,7 @@ module internal BindingData =
mEquals
mGetId
mItemEquals
(d: OneWaySeqLazyData<'model, 'a, 'b, 'id>) =
(d: OneWaySeqLazyData<'model, 'a, 'b, 'vm, 'id>) =
{ d with Get = mGet d.Get
Map = mMap d.Map
Equals = mEquals d.Equals
Expand Down Expand Up @@ -519,7 +519,7 @@ module internal BindingData =
let mapFunctions
mGet
mSet
(d: SubModelSelectedItemData<'model, 'msg, 'id>) =
(d: SubModelSelectedItemData<'model, 'msg, 'a, 'id>) =
{ d with Get = mGet d.Get
Set = mSet d.Set }

Expand Down Expand Up @@ -620,7 +620,7 @@ module internal BindingData =
(inMapBindingModel: 'bindingModel0 -> 'bindingModel)
(inMapBindingMsg: 'bindingMsg0 -> 'bindingMsg)
(inMapBindingViewModel: 'bindingViewModel0 -> 'bindingViewModel)
(d: SubModelSeqUnkeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel>) = {
(d: SubModelSeqUnkeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel, 'vm>) = {
GetModels = d.GetModels >> Seq.map outMapBindingModel
CreateViewModel = fun args -> d.CreateViewModel(args |> ViewModelArgs.map inMapBindingModel outMapBindingMsg) |> outMapBindingViewModel
CreateCollection = Seq.map inMapBindingViewModel >> d.CreateCollection >> CollectionTarget.map outMapBindingViewModel inMapBindingViewModel
Expand All @@ -645,7 +645,7 @@ module internal BindingData =
mGetModels
mGetBindings
mToMsg
(d: SubModelSeqUnkeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel>) =
(d: SubModelSeqUnkeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel, 'vm>) =
{ d with GetModels = mGetModels d.GetModels
CreateViewModel = mGetBindings d.CreateViewModel
ToMsg = mToMsg d.ToMsg }
Expand All @@ -671,7 +671,7 @@ module internal BindingData =
(inMapBindingMsg: 'bindingMsg0 -> 'bindingMsg)
(inMapBindingViewModel: 'bindingViewModel0 -> 'bindingViewModel)
(inMapId: 'id0 -> 'id)
(d: SubModelSeqKeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel, 'id>) = {
(d: SubModelSeqKeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel, 'vm, 'id>) = {
GetSubModels = d.GetSubModels >> Seq.map outMapBindingModel
CreateViewModel = fun args -> d.CreateViewModel(args |> ViewModelArgs.map inMapBindingModel outMapBindingMsg) |> outMapBindingViewModel
CreateCollection = Seq.map inMapBindingViewModel >> d.CreateCollection >> CollectionTarget.map outMapBindingViewModel inMapBindingViewModel
Expand Down Expand Up @@ -701,7 +701,7 @@ module internal BindingData =
mGetBindings
mToMsg
mGetId
(d: SubModelSeqKeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel, 'id>) =
(d: SubModelSeqKeyedData<'model, 'msg, 'bindingModel, 'bindingMsg, 'bindingViewModel, 'vm, 'id>) =
{ d with GetSubModels = mGetSubModels d.GetSubModels
CreateViewModel = mGetBindings d.CreateViewModel
ToMsg = mToMsg d.ToMsg
Expand All @@ -723,7 +723,7 @@ module internal BindingData =

let mapFunctions
mValidate
(d: ValidationData<'model, 'msg>) =
(d: ValidationData<'model, 'msg, 'a>) =
{ d with Validate = mValidate d.Validate }

let measureFunctions
Expand All @@ -735,7 +735,7 @@ module internal BindingData =

let mapFunctions
mEquals
(d: LazyData<'model, 'msg>) =
(d: LazyData<'model, 'msg, 'a>) =
{ d with Equals = mEquals d.Equals }

let measureFunctions
Expand Down
Loading

0 comments on commit 6679f76

Please sign in to comment.