Skip to content

Commit

Permalink
Split Attributes to Mvu & Components
Browse files Browse the repository at this point in the history
  • Loading branch information
TimLariviere committed Jun 30, 2024
1 parent da92948 commit 6eaa99a
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 105 deletions.
51 changes: 51 additions & 0 deletions src/Fabulous/Attributes.Components.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
namespace Fabulous

open System
open Fabulous
open Fabulous.ScalarAttributeDefinitions

module ComponentAttributes =
/// Define an attribute for EventHandler
let inline defineEventNoArg name ([<InlineIfLambda>] getEvent: obj -> IEvent<EventHandler, EventArgs>) : SimpleScalarAttributeDefinition<unit -> unit> =
let key =
SimpleScalarAttributeDefinition.CreateAttributeData(
ScalarAttributeComparers.noCompare,
(fun _ (newValueOpt: (unit -> unit) voption) node ->
match node.TryGetHandler(name) with
| ValueNone -> ()
| ValueSome handler -> handler.Dispose()

match newValueOpt with
| ValueNone -> node.RemoveHandler(name)
| ValueSome(fn) ->
let event = getEvent node.Target
node.SetHandler(name, event.Subscribe(fun _ -> fn())))
)

|> AttributeDefinitionStore.registerScalar

{ Key = key; Name = name }

/// Define an attribute for EventHandler<'T>
let inline defineEvent<'args>
name
([<InlineIfLambda>] getEvent: obj -> IEvent<EventHandler<'args>, 'args>)
: SimpleScalarAttributeDefinition<'args -> unit> =
let key =
SimpleScalarAttributeDefinition.CreateAttributeData(
ScalarAttributeComparers.noCompare,
(fun _ (newValueOpt: ('args -> unit) voption) node ->
match node.TryGetHandler(name) with
| ValueNone -> ()
| ValueSome handler -> handler.Dispose()

match newValueOpt with
| ValueNone -> node.RemoveHandler(name)
| ValueSome(fn) ->
let event = getEvent node.Target
node.SetHandler(name, event.Subscribe(fun args -> fn args)))
)

|> AttributeDefinitionStore.registerScalar

{ Key = key; Name = name }
67 changes: 67 additions & 0 deletions src/Fabulous/Attributes.Mvu.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
namespace Fabulous

open System
open System.Runtime.CompilerServices
open Fabulous
open Fabulous.ScalarAttributeDefinitions

type MsgValue = MsgValue of obj

[<Extension>]
type SimpleScalarAttributeDefinitionExtensions() =
[<Extension>]
static member inline WithValue(this: SimpleScalarAttributeDefinition<'args -> MsgValue>, value: 'args -> 'msg) =
this.WithValue(value >> box >> MsgValue)

module MvuAttributes =

/// Define an attribute for EventHandler
let inline defineEventNoArg name ([<InlineIfLambda>] getEvent: obj -> IEvent<EventHandler, EventArgs>) : SimpleScalarAttributeDefinition<MsgValue> =
let key =
SimpleScalarAttributeDefinition.CreateAttributeData(
ScalarAttributeComparers.noCompare,
(fun _ (newValueOpt: MsgValue voption) node ->
match node.TryGetHandler(name) with
| ValueNone -> ()
| ValueSome handler -> handler.Dispose()

match newValueOpt with
| ValueNone -> node.RemoveHandler(name)
| ValueSome(MsgValue msg) ->
let event = getEvent node.Target
let handler = event.Subscribe(fun _ -> Dispatcher.dispatch node msg)
node.SetHandler(name, handler))
)

|> AttributeDefinitionStore.registerScalar

{ Key = key; Name = name }

/// Define an attribute for EventHandler<'T>
let inline defineEvent<'args>
name
([<InlineIfLambda>] getEvent: obj -> IEvent<EventHandler<'args>, 'args>)
: SimpleScalarAttributeDefinition<'args -> MsgValue> =
let key =
SimpleScalarAttributeDefinition.CreateAttributeData(
ScalarAttributeComparers.noCompare,
(fun _ (newValueOpt: ('args -> MsgValue) voption) (node: IViewNode) ->
match node.TryGetHandler(name) with
| ValueNone -> ()
| ValueSome handler -> handler.Dispose()

match newValueOpt with
| ValueNone -> node.RemoveHandler(name)
| ValueSome fn ->
let event = getEvent node.Target

let handler =
event.Subscribe(fun args ->
let (MsgValue r) = fn args
Dispatcher.dispatch node r)

node.SetHandler(name, handler))
)
|> AttributeDefinitionStore.registerScalar

{ Key = key; Name = name }
105 changes: 0 additions & 105 deletions src/Fabulous/Attributes.fs
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,6 @@ type SmallScalarExtensions() =
) =
this.WithValue(value, SmallScalars.IntEnum.encode)

type MsgValue = MsgValue of obj

[<Extension>]
type SimpleScalarAttributeDefinitionExtensions() =
[<Extension>]
static member inline WithValue(this: SimpleScalarAttributeDefinition<'args -> MsgValue>, value: 'args -> 'msg) =
this.WithValue(value >> box >> MsgValue)

module Attributes =
/// Define an attribute that can fit into 8 bytes encoded as uint64 (such as float or bool)
let inline defineSmallScalar<'T>
Expand Down Expand Up @@ -281,100 +273,3 @@ module Attributes =
|> AttributeDefinitionStore.registerScalar

{ Key = key; Name = name }

/// Define an attribute for EventHandler
let inline defineEventNoArg name ([<InlineIfLambda>] getEvent: obj -> IEvent<EventHandler, EventArgs>) : SimpleScalarAttributeDefinition<MsgValue> =
let key =
SimpleScalarAttributeDefinition.CreateAttributeData(
ScalarAttributeComparers.noCompare,
(fun _ (newValueOpt: MsgValue voption) node ->
match node.TryGetHandler(name) with
| ValueNone -> ()
| ValueSome handler -> handler.Dispose()

match newValueOpt with
| ValueNone -> node.RemoveHandler(name)
| ValueSome(MsgValue msg) ->
let event = getEvent node.Target
let handler = event.Subscribe(fun _ -> Dispatcher.dispatch node msg)
node.SetHandler(name, handler))
)

|> AttributeDefinitionStore.registerScalar

{ Key = key; Name = name }

/// Define an attribute for EventHandler<'T>
let inline defineEvent<'args>
name
([<InlineIfLambda>] getEvent: obj -> IEvent<EventHandler<'args>, 'args>)
: SimpleScalarAttributeDefinition<'args -> MsgValue> =
let key =
SimpleScalarAttributeDefinition.CreateAttributeData(
ScalarAttributeComparers.noCompare,
(fun _ (newValueOpt: ('args -> MsgValue) voption) (node: IViewNode) ->
match node.TryGetHandler(name) with
| ValueNone -> ()
| ValueSome handler -> handler.Dispose()

match newValueOpt with
| ValueNone -> node.RemoveHandler(name)
| ValueSome fn ->
let event = getEvent node.Target

let handler =
event.Subscribe(fun args ->
let (MsgValue r) = fn args
Dispatcher.dispatch node r)

node.SetHandler(name, handler))
)
|> AttributeDefinitionStore.registerScalar

{ Key = key; Name = name }

let inline defineEventNoArgNoDispatch
name
([<InlineIfLambda>] getEvent: obj -> IEvent<EventHandler, EventArgs>)
: SimpleScalarAttributeDefinition<unit -> unit> =
let key =
SimpleScalarAttributeDefinition.CreateAttributeData(
ScalarAttributeComparers.noCompare,
(fun _ (newValueOpt: (unit -> unit) voption) node ->
match node.TryGetHandler(name) with
| ValueNone -> ()
| ValueSome handler -> handler.Dispose()

match newValueOpt with
| ValueNone -> node.RemoveHandler(name)
| ValueSome(fn) ->
let event = getEvent node.Target
node.SetHandler(name, event.Subscribe(fun _ -> fn())))
)

|> AttributeDefinitionStore.registerScalar

{ Key = key; Name = name }

let inline defineEventNoDispatch<'args>
name
([<InlineIfLambda>] getEvent: obj -> IEvent<EventHandler<'args>, 'args>)
: SimpleScalarAttributeDefinition<'args -> unit> =
let key =
SimpleScalarAttributeDefinition.CreateAttributeData(
ScalarAttributeComparers.noCompare,
(fun _ (newValueOpt: ('args -> unit) voption) node ->
match node.TryGetHandler(name) with
| ValueNone -> ()
| ValueSome handler -> handler.Dispose()

match newValueOpt with
| ValueNone -> node.RemoveHandler(name)
| ValueSome(fn) ->
let event = getEvent node.Target
node.SetHandler(name, event.Subscribe(fun args -> fn args)))
)

|> AttributeDefinitionStore.registerScalar

{ Key = key; Name = name }
2 changes: 2 additions & 0 deletions src/Fabulous/Fabulous.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
<Compile Include="Dispatch.fs" />
<Compile Include="Lifecycle.fs" />
<Compile Include="Attributes.fs" />
<Compile Include="Attributes.Components.fs" />
<Compile Include="Attributes.Mvu.fs" />
<Compile Include="ComponentContext.fs" />
<Compile Include="Component.fs" />
<Compile Include="State.fs" />
Expand Down

0 comments on commit 6eaa99a

Please sign in to comment.