Skip to content

Commit

Permalink
Add equality change detector
Browse files Browse the repository at this point in the history
  • Loading branch information
kylecorry31 committed Mar 28, 2024
1 parent 094a9f7 commit a30bb94
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 9 deletions.
6 changes: 6 additions & 0 deletions src/main/kotlin/com/kylecorry/luna/equality/ChangeDetector.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.kylecorry.luna.equality

interface ChangeDetector {
fun hasChanges(values: Array<out Any?>): Boolean
fun reset()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.kylecorry.luna.equality

class EqualityChangeDetector : ChangeDetector {

private val lock = Any()
private var cachedValues: MutableList<Any?>? = null

override fun hasChanges(values: Array<out Any?>): Boolean = synchronized(lock) {
var changed = false

val cached = if (cachedValues == null) {
cachedValues = mutableListOf()
changed = true
cachedValues
} else {
cachedValues
}!!

if (cached.size != values.size) {
values.forEachIndexed { index, value ->
if (index >= cached.size) {
cached.add(value)
} else {
cached[index] = value
}
}
changed = true
} else {
values.forEachIndexed { index, value ->
if (value != cached[index]) {
cached[index] = value
changed = true
}
}
}

return changed
}

override fun reset() = synchronized(lock) {
cachedValues = null
}

}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.kylecorry.luna.hash
package com.kylecorry.luna.equality

class HashChangeDetector {
class HashChangeDetector: ChangeDetector {

private val lock = Any()
private var cachedHashes: MutableList<Int>? = null

fun hasChanges(values: Array<out Any?>): Boolean = synchronized(lock) {
override fun hasChanges(values: Array<out Any?>): Boolean = synchronized(lock) {
var changed = false

val cached = if (cachedHashes == null) {
Expand Down Expand Up @@ -38,7 +38,7 @@ class HashChangeDetector {
return changed
}

fun reset() = synchronized(lock) {
override fun reset() = synchronized(lock) {
cachedHashes = null
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kylecorry.luna.hash
package com.kylecorry.luna.equality

object HashUtils {

Expand Down
4 changes: 2 additions & 2 deletions src/main/kotlin/com/kylecorry/luna/hooks/Effect.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.kylecorry.luna.hooks

import com.kylecorry.luna.hash.HashChangeDetector
import com.kylecorry.luna.equality.EqualityChangeDetector

/**
* An effect that runs an action if the state has changed (similar to the effect hook in React)
*/
class Effect {

private val lock = Any()
private val changeDetector = HashChangeDetector()
private val changeDetector = EqualityChangeDetector()

/**
* Run an action if the values have changed
Expand Down
4 changes: 2 additions & 2 deletions src/main/kotlin/com/kylecorry/luna/hooks/MemoizedValue.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.kylecorry.luna.hooks

import com.kylecorry.luna.hash.HashChangeDetector
import com.kylecorry.luna.equality.EqualityChangeDetector

class MemoizedValue<T> {

private var cachedValue: T? = null
private val changeDetector = HashChangeDetector()
private val changeDetector = EqualityChangeDetector()
private val lock = Any()

fun getOrPut(vararg dependencies: Any?, value: () -> T): T = synchronized(lock) {
Expand Down

0 comments on commit a30bb94

Please sign in to comment.