40 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
 | 
						|
namespace Engine.Core.Serialization;
 | 
						|
 | 
						|
public class IdentifiableRegistry
 | 
						|
{
 | 
						|
    public Event<IdentifiableRegistry, EntityRegisteredArguments> OnEntityRegistered = null!;
 | 
						|
 | 
						|
    private readonly Dictionary<string, Action<IIdentifiable>?> assignCallbacks = [];
 | 
						|
    private readonly Dictionary<string, IIdentifiable> registeredEntities = [];
 | 
						|
    public IReadOnlyDictionary<string, IIdentifiable> RegisteredEntities => registeredEntities;
 | 
						|
 | 
						|
    public void Add(IIdentifiable identifiable)
 | 
						|
    {
 | 
						|
        if (registeredEntities.TryAdd(identifiable.Id, identifiable))
 | 
						|
            OnEntityRegistered?.Invoke(this, new(identifiable));
 | 
						|
    }
 | 
						|
 | 
						|
    public void QueueAssign(string id, Action<IIdentifiable> setMethod)
 | 
						|
    {
 | 
						|
        assignCallbacks.TryAdd(id, null);
 | 
						|
        assignCallbacks[id] = assignCallbacks[id] + setMethod;
 | 
						|
    }
 | 
						|
 | 
						|
    public void AssignAll()
 | 
						|
    {
 | 
						|
        foreach ((string id, Action<IIdentifiable>? action) in assignCallbacks)
 | 
						|
            action?.Invoke(registeredEntities[id]);
 | 
						|
    }
 | 
						|
 | 
						|
    public void Reset()
 | 
						|
    {
 | 
						|
        assignCallbacks.Clear();
 | 
						|
        registeredEntities.Clear();
 | 
						|
    }
 | 
						|
 | 
						|
    public readonly record struct EntityRegisteredArguments(IIdentifiable Entity);
 | 
						|
}
 |