Skip to content

Commit

Permalink
Add opt and vopt helper functions for OneWayT, TwoWayT and OneWayToSo…
Browse files Browse the repository at this point in the history
…urceT
  • Loading branch information
marner2 committed Apr 23, 2024
1 parent fd8a645 commit bbec741
Showing 1 changed file with 96 additions and 2 deletions.
98 changes: 96 additions & 2 deletions src/Elmish.WPF/Binding.fs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,36 @@ module Binding =
OneWay.id
|> createBindingT

/// Creates a one-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let opt<'a, 'msg when 'a : null> : string -> Binding<'a option, 'msg, 'a> =
id<'a, 'msg>
>> mapModel Option.toObj

/// Creates a one-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let vopt<'a, 'msg when 'a : null> : string -> Binding<'a voption, 'msg, 'a> =
id<'a, 'msg>
>> mapModel ValueOption.toObj

/// Creates a one-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let opt2 x : Binding<'a option, 'msg, System.Nullable<'a>> =
x
|> id
|> mapModel Option.toNullable

/// Creates a one-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let vopt2 x : Binding<'a voption, 'msg, System.Nullable<'a>> =
x
|> id
|> mapModel ValueOption.toNullable

/// <summary>
/// Strongly-typed bindings that update the model from the view.
/// </summary>
Expand All @@ -116,6 +146,36 @@ module Binding =
OneWayToSource.id
|> createBindingT

/// Creates a one-way-to-source binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let opt<'a, 'model when 'a : null> : string -> Binding<'model, 'a option, 'a> =
id<'model, 'a>
>> mapMsg Option.ofObj

/// Creates a one-way-to-source binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let vopt<'a, 'model when 'a : null> : string -> Binding<'model, 'a voption, 'a> =
id<'model, 'a>
>> mapMsg ValueOption.ofObj

/// Creates a one-way-to-source binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let opt2 x : Binding<'model, 'a option, System.Nullable<'a>> =
x
|> id
|> mapMsg Option.ofNullable

/// Creates a one-way-to-source binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let vopt2 x : Binding<'model, 'a voption, System.Nullable<'a>> =
x
|> id
|> mapMsg ValueOption.ofNullable

/// <summary>
/// Strongly-typed bindings that update both ways
/// </summary>
Expand All @@ -125,6 +185,40 @@ module Binding =
let id<'a> : string -> Binding<'a, 'a, 'a> =
TwoWay.id
|> createBindingT

/// Creates a two-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let opt<'a when 'a : null> : string -> Binding<'a option, 'a option, 'a> =
id<'a>
>> mapModel Option.toObj
>> mapMsg Option.ofObj

/// Creates a two-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let vopt<'a when 'a : null> : string -> Binding<'a voption, 'a voption, 'a> =
id<'a>
>> mapMsg ValueOption.ofObj
>> mapModel ValueOption.toObj

/// Creates a two-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let opt2 x : Binding<'a option, 'a option, System.Nullable<'a>> =
x
|> id
|> mapMsg Option.ofNullable
|> mapModel Option.toNullable

/// Creates a two-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let vopt2 x : Binding<'a voption, 'a voption, System.Nullable<'a>> =
x
|> id
|> mapMsg ValueOption.ofNullable
|> mapModel ValueOption.toNullable

/// <summary>
/// The strongly-typed counterpart of <c>Binding.oneWaySeq</c> with parameter <c>getId</c>.
Expand Down Expand Up @@ -265,15 +359,15 @@ module Binding =
TwoWay.id
|> createBinding

/// Creates a one-way-to-source binding to an optional value. The binding
/// Creates a two-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let vopt<'a> : string -> Binding<'a voption, 'a voption> =
id<obj>
>> mapModel ValueOption.box
>> mapMsg ValueOption.unbox

/// Creates a one-way-to-source binding to an optional value. The binding
/// Creates a two-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a <c>null</c> value in the view.
let opt<'a> : string -> Binding<'a option, 'a option> =
Expand Down

0 comments on commit bbec741

Please sign in to comment.