diff --git a/packages/charm/src/listen.luau b/packages/charm/src/listen.luau index 56c3deb..9de1d9c 100644 --- a/packages/charm/src/listen.luau +++ b/packages/charm/src/listen.luau @@ -8,6 +8,7 @@ local resumeTracking = signals.resumeTracking local function listen(selector: () -> T, listener: (state: T, previous: T?, dispose: () -> ()) -> ()): () -> () local disposed = false + local mounted = true local current: T? local dispose: () -> () @@ -21,6 +22,13 @@ local function listen(selector: () -> T, listener: (state: T, previous: T?, d dispose = effectScope(function() effect(function() local value = selector() + + if mounted then + mounted = false + elseif value == current then + return + end + local previous = current current = value diff --git a/packages/charm/src/subscribe.luau b/packages/charm/src/subscribe.luau index 9797d55..9d9e1e6 100644 --- a/packages/charm/src/subscribe.luau +++ b/packages/charm/src/subscribe.luau @@ -8,17 +8,17 @@ local resumeTracking = signals.resumeTracking local function subscribe(selector: () -> T, listener: (T, T) -> ()): () -> () local current: T - local mount = true + local mounted = true local dispose: () -> () dispose = effectScope(function() effect(function() local value = selector() - if mount then + if mounted then current = value - mount = false - else + mounted = false + elseif value ~= current then local previous = current current = value