private static bool Equal <T>(TableSnapshot <T> x, TableSnapshot <T> y) where T : struct
 {
     return(ProjectTester.EqualCount(x, y) && x.Zip(y, (RowId xr, RowId yr) => {
         T xd, yd;
         x.GetData(xr, out xd);
         y.GetData(yr, out yd);
         foreach (IField <T> field in x.Fields)
         {
             if (field.Compare(ref xd, ref yd) != 0)
             {
                 return false;
             }
         }
         return true;
     }).All(r => r));
 }
 // Saves the table
 private static void SaveRecords <TRecord>(XmlWriter writer, TableSnapshot <TRecord> table) where TRecord : struct
 {
     foreach (RowId rowId in table.Rows)
     {
         TRecord data;
         table.GetData(rowId, out data);
         writer.WriteStartElement(table.Name, CircuitProject.PersistenceNamespace);
         foreach (IField <TRecord> field in table.Fields)
         {
             if (field is IFieldSerializer <TRecord> serializer && serializer.NeedToSave(ref data))
             {
                 writer.WriteStartElement(field.Name, CircuitProject.PersistenceNamespace);
                 writer.WriteString(serializer.GetTextValue(ref data));
                 writer.WriteEndElement();
             }
         }
         writer.WriteEndElement();
     }
 }