add generic component type to DynamicComponentProvider

This commit is contained in:
Igor Kravchenko 2020-10-03 23:48:26 +03:00
parent 76c91d83f7
commit 2902b096a5
2 changed files with 12 additions and 12 deletions

View File

@ -122,14 +122,14 @@ extension ComponentSingletonProvider: ComponentProvider {
/// This component provider calls a function to get the component instance. The function must /// This component provider calls a function to get the component instance. The function must
/// return a single component of the appropriate type. /// return a single component of the appropriate type.
public class DynamicComponentProvider { public class DynamicComponentProvider<C: Component> {
/// Wrapper for closure to make it hashable via ObjectIdentifier /// Wrapper for closure to make it hashable via ObjectIdentifier
public class Closure { public class Closure {
let provideComponent: () -> Component let provideComponent: () -> C
/// Initializer /// Initializer
/// - Parameter provideComponent: Swift closure returning component of the appropriate type /// - Parameter provideComponent: Swift closure returning component of the appropriate type
public init(provideComponent: @escaping () -> Component) { public init(provideComponent: @escaping () -> C) {
self.provideComponent = provideComponent self.provideComponent = provideComponent
} }
} }
@ -231,12 +231,12 @@ extension EntityState {
/// Creates a mapping for the component type to a method call. /// Creates a mapping for the component type to a method call.
/// A DynamicComponentProvider is used for the mapping. /// A DynamicComponentProvider is used for the mapping.
/// - Parameter method: The method to return the component instance /// - Parameter closure: The Closure instance to return the component instance
/// - Returns: This EntityState, so more modifications can be applied /// - Returns: This EntityState, so more modifications can be applied
@inline(__always) @inline(__always)
@discardableResult @discardableResult
public func addMethod<C: ComponentInitializable>(type: C.Type, closure: DynamicComponentProvider.Closure) -> Self { public func addMethod<C: ComponentInitializable>(closure: DynamicComponentProvider<C>.Closure) -> Self {
add(type).withMethod(closure) add(C.self).withMethod(closure)
return self return self
} }
@ -308,10 +308,10 @@ public class StateComponentMapping {
/// Creates a mapping for the component type to a method call. A /// Creates a mapping for the component type to a method call. A
/// DynamicComponentProvider is used for the mapping. /// DynamicComponentProvider is used for the mapping.
/// - Parameter method: The method to return the component instance /// - Parameter closure: The Closure instance to return the component instance
/// - Returns: This ComponentMapping, so more modifications can be applied /// - Returns: This ComponentMapping, so more modifications can be applied
@discardableResult @discardableResult
public func withMethod(_ closure: DynamicComponentProvider.Closure) -> Self { public func withMethod<C: Component>(_ closure: DynamicComponentProvider<C>.Closure) -> Self {
setProvider(DynamicComponentProvider(closure: closure)) setProvider(DynamicComponentProvider(closure: closure))
return self return self
} }

View File

@ -213,7 +213,7 @@ class EntityStateTests: XCTestCase {
state.add(MockComponent.self).withMethod(dynamickProvider) state.add(MockComponent.self).withMethod(dynamickProvider)
let provider = state.providers[MockComponent.identifier] let provider = state.providers[MockComponent.identifier]
XCTAssertNotNil(provider) XCTAssertNotNil(provider)
XCTAssertTrue(provider is DynamicComponentProvider?) XCTAssertTrue(provider is DynamicComponentProvider<MockComponent>?)
XCTAssertTrue(provider?.getComponent() is MockComponent) XCTAssertTrue(provider?.getComponent() is MockComponent)
} }
@ -243,7 +243,7 @@ class EntityStateTests: XCTestCase {
state.add(MockComponent.self).withMethod(.init { MockComponent() }) state.add(MockComponent.self).withMethod(.init { MockComponent() })
let provider = state.get(MockComponent.self) let provider = state.get(MockComponent.self)
XCTAssertNotNil(provider) XCTAssertNotNil(provider)
XCTAssertTrue(provider is DynamicComponentProvider?) XCTAssertTrue(provider is DynamicComponentProvider<MockComponent>?)
} }
func testGetReturnsTypeProvider() { func testGetReturnsTypeProvider() {
@ -293,8 +293,8 @@ class EntityStateTests: XCTestCase {
func testAddMethodCreatesMappingAndSetsDynamicProviderForType() { func testAddMethodCreatesMappingAndSetsDynamicProviderForType() {
let component = MockComponent() let component = MockComponent()
state.addMethod(type: MockComponent.self, closure: .init { component }) state.addMethod(closure: .init { component })
XCTAssertTrue(state.get(MockComponent.self) is DynamicComponentProvider?) XCTAssertTrue(state.get(MockComponent.self) is DynamicComponentProvider<MockComponent>?)
XCTAssertTrue(state.get(MockComponent.self)?.getComponent() === component) XCTAssertTrue(state.get(MockComponent.self)?.getComponent() === component)
} }