namespace UniversalNetFrame451;

public static class Extensions
{
    public static bool TryDequeue<T>(this Queue<T> queue, out T output)
    {
        output = default;

        if (queue.Count == 0)
            return false;

        output = queue.Dequeue();
        return true;
    }

    public static bool TryPeek<T>(this Queue<T> queue, out T output)
    {
        output = default;

        if (queue.Count == 0)
            return false;

        output = queue.Peek();
        return true;
    }

    public static bool TryAddElseReplace<TKey, TValue>(this Dictionary<TKey, TValue> dic, TKey key, TValue value)
    {
        if (dic.ContainsKey(key))
        {
            dic[key] = value;
            return false;
        }
        else
        {
            dic.Add(key, value);
            return true;
        }

    }

    public static bool NotIn<T_Enum>(this T_Enum t_Enum, T_Enum enums1) where T_Enum : Enum
    {
        if (Enum.Equals(t_Enum, enums1))
            return false;

        return true;
    }



    public static bool NotIn<T_Enum>(this T_Enum t_Enum, T_Enum enums1, T_Enum enums2) where T_Enum : Enum
    {
        if (Enum.Equals(t_Enum, enums1))
            return false;

        if (Enum.Equals(t_Enum, enums2))
            return false;

        return true;
    }

    public static bool NotIn<T_Enum>(this T_Enum t_Enum, T_Enum enums1, T_Enum enums2, T_Enum enums3) where T_Enum : Enum
    {
        if (Enum.Equals(t_Enum, enums1))
            return false;
        if (Enum.Equals(t_Enum, enums2))
            return false;
        if (Enum.Equals(t_Enum, enums3))
            return false;
        return true;
    }

    public static bool NotIn<T_Enum>(this T_Enum t_Enum, T_Enum enums1, T_Enum enums2, T_Enum enums3, T_Enum enums4) where T_Enum : Enum
    {
        if (Enum.Equals(t_Enum, enums1))
            return false;
        if (Enum.Equals(t_Enum, enums2))
            return false;
        if (Enum.Equals(t_Enum, enums3))
            return false;
        if (Enum.Equals(t_Enum, enums4))
            return false;
        return true;
    }


    public static bool In<T_Enum>(this T_Enum t_Enum, T_Enum enums1) where T_Enum : Enum
    {
        if (Enum.Equals(t_Enum, enums1))
            return true;

        return false;
    }


    public static bool In<T_Enum>(this T_Enum t_Enum, T_Enum enums1, T_Enum enums2) where T_Enum : Enum
    {
        if (Enum.Equals(t_Enum, enums1))
            return true;

        if (Enum.Equals(t_Enum, enums2))
            return true;

        return false;
    }

    public static bool In<T_Enum>(this T_Enum t_Enum, T_Enum enums1, T_Enum enums2, T_Enum enums3) where T_Enum : Enum
    {
        if (Enum.Equals(t_Enum, enums1))
            return true;
        if (Enum.Equals(t_Enum, enums2))
            return true;
        if (Enum.Equals(t_Enum, enums3))
            return true;
        return false;
    }

    public static bool In<T_Enum>(this T_Enum t_Enum, T_Enum enums1, T_Enum enums2, T_Enum enums3, T_Enum enums4) where T_Enum : Enum
    {
        if (Enum.Equals(t_Enum, enums1))
            return true;
        if (Enum.Equals(t_Enum, enums2))
            return true;
        if (Enum.Equals(t_Enum, enums3))
            return true;
        if (Enum.Equals(t_Enum, enums4))
            return true;
        return false;
    }

    public static void Foreach<T>(this IEnumerable<T> t, Action<T> action)
    {
        foreach (var item in t)
            action.Invoke(item);
    }

    public static void ConditionForeach<T>(this IEnumerable<T> t, Action<T> action, Func<T, bool> judger)
    {
        foreach (var item in t)
        {
            if (!judger.Invoke(item))
                continue;

            action.Invoke(item);
        }
    }
}
