diff options
-rw-r--r-- | gjs/src/variable.ts | 5 | ||||
-rw-r--r-- | lua/astal/variable.lua | 8 |
2 files changed, 10 insertions, 3 deletions
diff --git a/gjs/src/variable.ts b/gjs/src/variable.ts index 05e142f..d583ab1 100644 --- a/gjs/src/variable.ts +++ b/gjs/src/variable.ts @@ -195,13 +195,14 @@ class VariableWrapper<T> extends Function { return this as unknown as Variable<T> } - static derive<V, + static derive< const Deps extends Array<Variable<any> | Binding<any>>, Args extends { [K in keyof Deps]: Deps[K] extends Variable<infer T> ? T : Deps[K] extends Binding<infer T> ? T : never }, - >(deps: Deps, fn: (...args: Args) => V) { + V = Args, + >(deps: Deps, fn: (...args: Args) => V = (...args) => args as unknown as V) { const update = () => fn(...deps.map(d => d.get()) as Args) const derived = new Variable(update()) const unsubs = deps.map(dep => dep.subscribe(() => derived.set(update()))) diff --git a/lua/astal/variable.lua b/lua/astal/variable.lua index c7c2ec9..1e894b5 100644 --- a/lua/astal/variable.lua +++ b/lua/astal/variable.lua @@ -223,9 +223,15 @@ function Variable:observe(object, sigOrFn, callback) end ---@param deps Variable | (Binding | Variable)[] ----@param transform fun(...): any +---@param transform? fun(...): any ---@return Variable function Variable.derive(deps, transform) + if type(transform) == "nil" then + transform = function(...) + return { ... } + end + end + if getmetatable(deps) == Variable then local var = Variable.new(transform(deps:get())) deps:subscribe(function(v) |