fireblade-ecs/Sources/FirebladeECS/Family.swift

132 lines
3.1 KiB
Swift

//
// Family.swift
// FirebladeECS
//
// Created by Christian Treffs on 08.10.17.
//
// MARK: - family
public final class Family {
internal var nexus: Nexus
// members of this Family must conform to these traits
public let traits: FamilyTraitSet
internal init(_ nexus: Nexus, traits: FamilyTraitSet) {
self.nexus = nexus
self.traits = traits
}
deinit {
}
}
extension Family {
public final func canBecomeMember(_ entity: Entity) -> Bool {
return nexus.canBecomeMember(entity, in: self)
}
public final func isMember(_ entity: Entity) -> Bool {
return nexus.isMember(entity, in: self)
}
internal var members: EntitySet {
return nexus.members(of: self)
}
}
// MARK: - member iterator
extension Family {
/*
func makeIterator<A>() -> AnyIterator<(Entity, A)> where A: Component {
var members = self.members.makeIterator()
return AnyIterator<(Entity, A)> { [unowned self] in
let entityId: EntityIdentifier = members.next()!
let entity: Entity = self.nexus.get(entity: entityId)!
let a: A = entity.get()!
return (entity, a)
}
}
func makeIterator<A, B>() -> AnyIterator<(Entity, A, B)> where A: Component, B: Component {
var members = self.members.makeIterator()
return AnyIterator<(Entity, A, B)> { [unowned self] in
let entityId: EntityIdentifier = members.next()!
let entity: Entity = self.nexus.get(entity: entityId)!
let a: A = entity.get()!
let b: B = entity.get()!
return (entity, a, b)
}
}
func makeIterator<A, B, C>() -> AnyIterator<(Entity, A, B, C)> where A: Component, B: Component, C: Component {
var members = self.members.makeIterator()
return AnyIterator<(Entity, A, B, C)> { [unowned self] in
let entityId: EntityIdentifier = members.next()!
let entity: Entity = self.nexus.get(entity: entityId)!
let a: A = entity.get()!
let b: B = entity.get()!
let c: C = entity.get()!
return (entity, a, b, c)
}
}
*/
}
/*
// MARK: - Equatable
extension Family: Equatable {
public static func ==(lhs: Family, rhs: Family) -> Bool {
return lhs.traits == rhs.traits
}
}
// MARK: - Hashable
extension Family: Hashable {
public var hashValue: Int {
return traits.hashValue
}
}
*/
/*
// MARK: - event dispatcher
extension Family: EventDispatcher {
public func dispatch<E>(_ event: E) where E: Event {
dispatcher.dispatch(event)
}
fileprivate func notifyCreated() {
dispatch(FamilyCreated(family: traits))
}
fileprivate func notify(added newEntity: EntityIdentifier) {
dispatch(FamilyMemberAdded(member: newEntity, to: traits))
}
fileprivate func notify(removed removedEntity: EntityIdentifier) {
dispatch(FamilyMemberRemoved(member: removedEntity, from: traits))
}
fileprivate func notifyDestroyed() {
dispatch(FamilyDestroyed(family: traits))
}
}
// MARK: - event handler
extension Family: EventHandler {
fileprivate final func handleComponentAddedToEntity(event: ComponentAdded) {
update(membership: event.to)
}
fileprivate final func handleComponentUpdatedAtEntity(event: ComponentUpdated) {
update(membership: event.at)
}
fileprivate final func handleComponentRemovedFromEntity(event: ComponentRemoved) {
update(membership: event.from)
}
}
*/