Code/Extensions/DisplayInfoExtensions.cs
namespace Nodebox.Extensions;

public static class DisplayInfoExtensions {
    extension(DisplayInfo displayInfo) {
        public string CompactName {
            get {
                return displayInfo.Name.Replace(" ", null);
            }
        }

        public static DisplayInfo ForGenericType(Type type) => ForGenericTypeImpl(type);
    }

    // Weird bug if you don't do this smh... (see commented example below)
    public static DisplayInfo ForGenericTypeImpl(Type type) {
        if (_genericDisplayInfoCache.TryGetValue(type, out var cached)) {
            return cached;
        }

        var info = DisplayInfo.ForType(type);
        var name = info.CompactName;
        if (TypeLibrary.GetType(type).IsGenericType) {
            Type[] generics;

            try {
                generics = TypeLibrary.GetGenericArguments(type);
                name = $"{name}<{string.Join(", ", generics.Select(x => ForGenericTypeImpl(x).Name))}>";
            }
            catch {
                generics = TypeLibrary.GetType(type).GenericArguments;
                name = $"{name}<{string.Join(", ", generics.Select(x => x.Name))}>";
            }

            Assert.True(generics.Length > 0); // ?
        }

        info.Name = name;
        _genericDisplayInfoCache.Add(type, info);
        return info;
    }

    private readonly static Dictionary<Type, DisplayInfo> _genericDisplayInfoCache = [];
}


// public class Target {
//     public string Name { get; set; }
//     public Target Child { get; set; }
// }

// public static class FunnyExtensions {
//     extension(Target _target) {
//         public static Target Compress(Target target) => CompressImpl(target);
//     }

//     public static Target CompressImpl(Target target) {
//         return new Target {
//             Name = target.Name + (target.Child != null ? Target.Compress(target.Child).Name : "")
//         };
//     }
// }