Skip to content

Commit 16a1619

Browse files
authored
Implement lastCompute (#398)
1 parent 234d607 commit 16a1619

File tree

11 files changed

+24
-3
lines changed

11 files changed

+24
-3
lines changed

docs/api-reference/graph/types/graphobject.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ export type GraphObject = ScopedObject & {
1515
dependencySet: {[GraphObject]: unknown},
1616
dependentSet: {[GraphObject]: unknown},
1717
lastChange: number?,
18+
lastCompute: number?,
1819
timeliness: "lazy" | "eager",
1920
validity: "valid" | "invalid" | "busy",
20-
_evaluate: (GraphObject, lastChange: number?) -> boolean
21+
_evaluate: (GraphObject) -> boolean
2122
}
2223
```
2324

@@ -75,6 +76,16 @@ object.
7576
The `os.clock()` time of this object's most recent meaningful change, or `nil`
7677
if the object is newly created.
7778

79+
<h3 markdown>
80+
lastCompute
81+
<span class="fusiondoc-api-type">
82+
: number?
83+
</span>
84+
</h3>
85+
86+
The `os.clock()` time of when this object was most recently computed, or `nil`
87+
if the object is newly created.
88+
7889
<h3 markdown>
7990
timeliness
8091
<span class="fusiondoc-api-type">

src/Animation/ExternalTime.luau

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ local function ExternalTime(
3939
createdAt = createdAt,
4040
dependentSet = {},
4141
lastChange = nil,
42+
lastCompute = nil,
4243
scope = scope,
4344
validity = "invalid"
4445
},

src/Animation/Spring.luau

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ local function Spring<T>(
8181
dependencySet = {},
8282
dependentSet = {},
8383
lastChange = nil,
84+
lastCompute = nil,
8485
scope = scope,
8586
validity = "invalid",
8687
_activeDamping = -1,

src/Animation/Stopwatch.luau

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ local function Stopwatch(
5353
dependencySet = {},
5454
dependentSet = {},
5555
lastChange = nil,
56+
lastCompute = nil,
5657
scope = scope,
5758
validity = "invalid",
5859
_EXTREMELY_DANGEROUS_usedAsValue = 0,

src/Animation/Tween.luau

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ local function Tween<T>(
6767
dependencySet = {},
6868
dependentSet = {},
6969
lastChange = nil,
70+
lastCompute = nil,
7071
scope = scope,
7172
validity = "invalid",
7273
_activeDuration = nil,

src/Graph/evaluate.luau

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ local function evaluate(
2121
if target.validity == "busy" then
2222
return External.logError("infiniteLoop")
2323
end
24-
local firstEvaluation = target.lastChange == nil
24+
local firstEvaluation = target.lastCompute == nil or target.lastChange == nil
2525
local isInvalid = target.validity == "invalid"
2626
if firstEvaluation or isInvalid or forceComputation then
2727
local needsComputation = firstEvaluation or forceComputation
2828
if not needsComputation then
2929
for dependency in target.dependencySet do
3030
evaluate(dependency, false)
31-
if dependency.lastChange > target.lastChange then
31+
if dependency.lastChange > target.lastCompute then
3232
needsComputation = true
3333
break
3434
end
@@ -42,6 +42,7 @@ local function evaluate(
4242
end
4343
target.validity = "busy"
4444
targetMeaningfullyChanged = target:_evaluate() or firstEvaluation
45+
target.lastCompute = os.clock()
4546
end
4647
if targetMeaningfullyChanged then
4748
target.lastChange = os.clock()

src/State/Computed.luau

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ local function Computed<T, S>(
5252
dependencySet = {},
5353
dependentSet = {},
5454
lastChange = nil,
55+
lastCompute = nil,
5556
scope = scope,
5657
validity = "invalid",
5758
_EXTREMELY_DANGEROUS_usedAsValue = nil,

src/State/Value.luau

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ local function Value<T>(
3737
createdAt = createdAt,
3838
dependentSet = {},
3939
lastChange = os.clock(),
40+
lastCompute = os.clock(),
4041
scope = scope,
4142
validity = "valid",
4243
_EXTREMELY_DANGEROUS_usedAsValue = initialValue

src/Types.luau

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export type GraphObject = ScopedObject & {
7878
dependencySet: {[GraphObject]: unknown},
7979
dependentSet: {[GraphObject]: unknown},
8080
lastChange: number?,
81+
lastCompute: number?,
8182
timeliness: "lazy" | "eager",
8283
validity: "valid" | "invalid" | "busy",
8384
_evaluate: (GraphObject) -> boolean

test/Spec/Graph/evaluate.spec.luau

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@ return function()
415415
local seen = {}
416416
for _, searchTarget in searchNow do
417417
searchTarget.lastChange = -depth
418+
searchTarget.lastCompute = -depth
418419
searchTarget.validity = if depth == 0 then "valid" else "invalid"
419420
for dependent in searchTarget.dependentSet do
420421
if seen[dependent] then

0 commit comments

Comments
 (0)