private void DiffFunctions()
        {
            if (Left.LibraryFunctions.Count() != Right.LibraryFunctions.Count())
            {
                Log.WriteLineWithHeader("[Diff]: ", "Left number of functions is not equal to right number of functions");
            }


            var leftFuncs  = new HashSet <LSLLibraryFunctionSignature>(Left.LibraryFunctions.SelectMany(x => x));
            var rightFuncs = new HashSet <LSLLibraryFunctionSignature>(Right.LibraryFunctions.SelectMany(x => x));

            if (!leftFuncs.SetEquals(rightFuncs))
            {
                foreach (var sig in leftFuncs.Except(rightFuncs))
                {
                    if (!Right.LibraryFunctionExist(sig.Name))
                    {
                        Log.WriteLineWithHeader("[Diff]: ", "Left function {0} does not exist in Right", sig.Name);
                        NotInRight.DefineFunction(sig);
                    }
                    else
                    {
                        var overloads1 =
                            new HashSet <LSLLibraryFunctionSignature>(Left.GetLibraryFunctionSignatures(sig.Name));
                        var overloads2 =
                            new HashSet <LSLLibraryFunctionSignature>(Right.GetLibraryFunctionSignatures(sig.Name));
                        if (overloads1.SetEquals(overloads2))
                        {
                            Log.WriteLineWithHeader("[Diff]: ", "Left function {0} is different in Right", sig.Name);
                        }
                    }
                }

                foreach (var sig in rightFuncs.Except(leftFuncs))
                {
                    if (!Left.LibraryFunctionExist(sig.Name))
                    {
                        Log.WriteLineWithHeader("[Diff]: ", "Right function {0} does not exist in Left", sig.Name);
                        NotInLeft.DefineFunction(sig);
                    }
                    else
                    {
                        var overloads1 =
                            new HashSet <LSLLibraryFunctionSignature>(Left.GetLibraryFunctionSignatures(sig.Name));
                        var overloads2 =
                            new HashSet <LSLLibraryFunctionSignature>(Right.GetLibraryFunctionSignatures(sig.Name));
                        if (overloads1.SetEquals(overloads2))
                        {
                            Log.WriteLineWithHeader("[Diff]: ", "Right function {0} is different in Left", sig.Name);
                        }
                    }
                }
            }
        }
        private void DiffEvents()
        {
            if (Left.LibraryEvents.Count() != Right.LibraryEvents.Count())
            {
                Log.WriteLineWithHeader("[Diff]: ", "Left number of events is not equal to right number of events");
            }


            var leftEvents  = new HashSet <LSLLibraryEventSignature>(Left.LibraryEvents);
            var rightEvents = new HashSet <LSLLibraryEventSignature>(Right.LibraryEvents);

            if (!leftEvents.SetEquals(rightEvents))
            {
                foreach (var sig in leftEvents.Except(rightEvents))
                {
                    if (!Right.EventHandlerExist(sig.Name))
                    {
                        Log.WriteLineWithHeader("[Diff]: ", "Left event {0} does not exist in Right", sig.Name);
                        NotInRight.DefineEventHandler(sig);
                    }
                    else
                    {
                        Log.WriteLineWithHeader("[Diff]: ", "Left event {0} is different in Right", sig.Name);
                    }
                }

                foreach (var sig in rightEvents.Except(leftEvents))
                {
                    if (!Left.EventHandlerExist(sig.Name))
                    {
                        Log.WriteLineWithHeader("[Diff]: ", "Right event {0} does not exist in Left", sig.Name);
                        NotInLeft.DefineEventHandler(sig);
                    }
                    else
                    {
                        Log.WriteLineWithHeader("[Diff]: ", "Right event {0} is different in Left", sig.Name);
                    }
                }
            }
        }