Chained state objects
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)
This would require some kind of utility to chain methods on UsedAs<T>. Presumably this would not construct a state object.
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>
Personally I lean towards the pipe API and not extending the metatable for state objects becauae it's forwards compatible with #301