Fusion icon indicating copy to clipboard operation
Fusion copied to clipboard

Chained state objects

Open dphfox opened this issue 11 months ago • 4 comments

Currently, we write a lot of:

scope:Spring(
    scope:Computed(function()
        ...
    end),
    50
)

What if instead, you could write more of:

scope:Computed(function()
    ...
end):Spring(50)

In short, the proposal would be to allow extending the metatable of created state objects to include method calls to state object constructors that declare themselves as chainable.

In the future, this could lead to functional-style pipelines:

numCoins
    :Map(function(use, x) return x - use(itemPrice) end)
    :Spring(50)
    :Map(function(use, x) return math.round(x) end)
    :Map(function(use, x) return `You have {x} coins` end)

dphfox avatar Jan 24 '25 01:01 dphfox

This would require some kind of utility to chain methods on UsedAs<T>. Presumably this would not construct a state object.

dphfox avatar Jan 24 '25 01:01 dphfox

In fact, instead of extending the metatable of all objects by default, this could be on-demand and support UsedAs<T> natively:

Pipe(usedAs)
    :ForValues(function(use, _ value)
        ...
    end)

Scope could be inferred from the originally piped object, under the stipulation that all chained operations do not require scopes for non-ScopeObject UsedAs<T>

dphfox avatar Jan 24 '25 01:01 dphfox

Personally I lean towards the pipe API and not extending the metatable for state objects becauae it's forwards compatible with #301

znotfireman avatar Feb 18 '25 23:02 znotfireman