Skip to content

Commit

Permalink
tech(entityNode): Remove onChange attribute (#73)
Browse files Browse the repository at this point in the history
  • Loading branch information
pjechris authored Jan 3, 2025
1 parent 2c0ca28 commit 6bb6cb5
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 18 deletions.
14 changes: 5 additions & 9 deletions Sources/CohesionKit/EntityStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ public class EntityStore {
/// - Parameter named: the alias to look for
public func find<T: Identifiable>(named: AliasKey<T>) -> EntityObserver<T?> {
identityQueue.sync {
let node = refAliases[safe: named, onChange: registry.enqueueChange(for:)]
let node = refAliases[safe: named]
return EntityObserver(alias: node, registry: registry)
}
}
Expand All @@ -146,15 +146,13 @@ public class EntityStore {
/// - Returns: an observer returning the alias value. Note that the value will be an Array
public func find<C: Collection>(named: AliasKey<C>) -> EntityObserver<C?> {
identityQueue.sync {
let node = refAliases[safe: named, onChange: registry.enqueueChange(for:)]
let node = refAliases[safe: named]
return EntityObserver(alias: node, registry: registry)
}
}

func nodeStore<T: Identifiable>(in node: EntityNode<T>? = nil, entity: T, modifiedAt: Stamp?) -> EntityNode<T> {
let node = node ?? storage[entity, new: EntityNode(entity, modifiedAt: nil) { [registry] in
registry.enqueueChange(for: $0)
}]
let node = node ?? storage[entity, new: EntityNode(entity, modifiedAt: nil)]

guard !registry.hasPendingChange(for: node) else {
return node
Expand All @@ -175,9 +173,7 @@ public class EntityStore {
}

func nodeStore<T: Aggregate>(in node: EntityNode<T>? = nil, entity: T, modifiedAt: Stamp?) -> EntityNode<T> {
let node = node ?? storage[entity, new: EntityNode(entity, modifiedAt: nil) { [registry] in
registry.enqueueChange(for: $0)
}]
let node = node ?? storage[entity, new: EntityNode(entity, modifiedAt: nil)]

guard !registry.hasPendingChange(for: node) else {
return node
Expand Down Expand Up @@ -227,7 +223,7 @@ public class EntityStore {
}

private func storeAlias<T>(content: T?, key: AliasKey<T>, modifiedAt: Stamp?) {
let aliasNode = refAliases[safe: key, onChange: registry.enqueueChange(for:)]
let aliasNode = refAliases[safe: key]
let aliasContainer = AliasContainer(key: key, content: content)

_ = nodeStore(in: aliasNode, entity: aliasContainer, modifiedAt: modifiedAt)
Expand Down
4 changes: 2 additions & 2 deletions Sources/CohesionKit/Storage/AliasStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ extension AliasStorage {
set { self[buildKey(for: T.self, key: aliasKey)] = newValue }
}

subscript<T>(safe key: AliasKey<T>, onChange onChange: ((EntityNode<AliasContainer<T>>) -> Void)? = nil) -> EntityNode<AliasContainer<T>> {
subscript<T>(safe key: AliasKey<T>) -> EntityNode<AliasContainer<T>> {
mutating get {
let storeKey = buildKey(for: T.self, key: key)
return self[key: key, default: EntityNode(AliasContainer(key: key), key: storeKey, modifiedAt: nil, onChange: onChange)]
return self[key: key, default: EntityNode(AliasContainer(key: key), key: storeKey, modifiedAt: nil)]
}
}

Expand Down
12 changes: 5 additions & 7 deletions Sources/CohesionKit/Storage/EntityNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -59,27 +59,25 @@ class EntityNode<T>: AnyEntityNode {

let storageKey: String

private let onChange: ((EntityNode<T>) -> Void)?
/// last time the ref.value was changed. Any subsequent change must have a higher value to be applied
/// if nil ref has no stamp and any change will be accepted
private var modifiedAt: Stamp?
/// entity children
private(set) var children: [PartialKeyPath<T>: SubscribedChild] = [:]

init(ref: Observable<T>, key: String, modifiedAt: Stamp?, onChange: ((EntityNode<T>) -> Void)? = nil) {
init(ref: Observable<T>, key: String, modifiedAt: Stamp?) {
self.ref = ref
self.modifiedAt = modifiedAt
self.onChange = onChange
self.storageKey = key
}

convenience init(_ entity: T, key: String, modifiedAt: Stamp?, onChange: ((EntityNode<T>) -> Void)? = nil) {
self.init(ref: Observable(value: entity), key: key, modifiedAt: modifiedAt, onChange: onChange)
convenience init(_ entity: T, key: String, modifiedAt: Stamp?) {
self.init(ref: Observable(value: entity), key: key, modifiedAt: modifiedAt)
}

convenience init(_ entity: T, modifiedAt: Stamp?, onChange: ((EntityNode<T>) -> Void)? = nil) where T: Identifiable {
convenience init(_ entity: T, modifiedAt: Stamp?) where T: Identifiable {
let key = "\(T.self)-\(entity.id)"
self.init(entity, key: key, modifiedAt: modifiedAt, onChange: onChange)
self.init(entity, key: key, modifiedAt: modifiedAt)
}

/// change the entity to a new value. If modifiedAt is nil or > to previous date update the value will be changed
Expand Down

0 comments on commit 6bb6cb5

Please sign in to comment.