UnityRecords GetUnityRecords()
        {
            UnityRecords records = new UnityRecords();

            getRecordsInternalCallback(records.undoRecords, records.redoRecords);
            return(records);
        }
        void Update()
        {
            if (!m_undoRedoPerformed)
            {
                m_unityRecordsOnUndoRedoPerformed = m_unityRecords;
            }

            m_undoRedoPerformed = false;
            m_unityRecords      = GetUnityRecords();
        }
        void OnUndoRedoPerformed()
        {
            m_undoRedoPerformed = true;
            m_unityRecords      = GetUnityRecords();

            int  undoDiff = m_unityRecords.undoRecords.Count - m_unityRecordsOnUndoRedoPerformed.undoRecords.Count;
            int  redoDiff = m_unityRecords.redoRecords.Count - m_unityRecordsOnUndoRedoPerformed.redoRecords.Count;
            bool wasUndo  = undoDiff < 0;
            bool wasRedo  = undoDiff > 0;

            undoDiff = Mathf.Abs(undoDiff);
            redoDiff = Mathf.Abs(redoDiff);

            if (wasUndo)
            {
                #if UNDO_DEBUG
                Debug.Log("undo performed: " + undoDiff);
                #endif

                int l = m_unityRecordsOnUndoRedoPerformed.undoRecords.Count - 1;
                m_lastUndoRecords.Clear();

                for (int i = 0; i < undoDiff; i++)
                {
                    m_lastUndoRecords.Add(m_unityRecordsOnUndoRedoPerformed.undoRecords[l - i]);
                }

                OnUndoPerformed(m_lastUndoRecords);
                onRecordsChanged?.Invoke();
            }
            else if (wasRedo)
            {
                #if UNDO_DEBUG
                Debug.Log("redo performed: " + redoDiff);
                #endif

                int l = m_unityRecordsOnUndoRedoPerformed.redoRecords.Count - 1;
                m_lastRedoRecords.Clear();

                for (int i = 0; i < redoDiff; i++)
                {
                    m_lastRedoRecords.Add(m_unityRecordsOnUndoRedoPerformed.redoRecords[l - i]);
                }

                OnRedoPerformed(m_lastRedoRecords);
                onRecordsChanged?.Invoke();
            }
            #if UNDO_DEBUG
            else
            {
                Debug.Log("Nothing changed.");
            }
            #endif
        }