General/TagSetBuilder.cs
using Sandbox;
using System.Collections.Generic;

namespace ExtendedBox.General;

public sealed class TagSetBuilder
{
    private readonly List<string> _tags = [];


    public static TagSetBuilder Create(params string[] tags)
    {
        TagSetBuilder builder = new();
        builder.Add(tags);
        return builder;
    }

    public static TagSetBuilder Create(IEnumerable<string> tags)
    {
        TagSetBuilder builder = new();
        builder.Add(tags);
        return builder;
    }


    public TagSetBuilder Add(params string[] tags)
    {
        _tags.AddRange(tags);
        return this;
    }

    public TagSetBuilder Add(IEnumerable<string> tags)
    {
        _tags.AddRange(tags);
        return this;
    }

    public TagSetBuilder Toggle(params string[] tags)
    {
        foreach(var tag in tags)
        {
            if(!_tags.Remove(tag))
                _tags.Add(tag);
        }
        return this;
    }

    public TagSetBuilder Toggle(IEnumerable<string> tags)
    {
        foreach(var tag in tags)
        {
            if(!_tags.Remove(tag))
                _tags.Add(tag);
        }
        return this;
    }

    public TagSetBuilder Remove(IEnumerable<string> tags)
    {
        foreach(var tag in tags)
            _tags.Remove(tag);
        return this;
    }

    public TagSetBuilder Remove(params string[] tags)
    {
        foreach(var tag in tags)
            _tags.Remove(tag);
        return this;
    }

    public TagSetBuilder Clear()
    {
        _tags.Clear();
        return this;
    }

    public TagSet Build()
    {
        TagSet tagSet = [];
        foreach(var tag in _tags)
            tagSet.Add(tag);
        return tagSet;
    }
}