func diffSummaryStructs(ch chan<- diffSummaryProgress, v1, v2 types.Struct) { size1 := uint64(v1.Type().Desc.(types.StructDesc).Len()) size2 := uint64(v2.Type().Desc.(types.StructDesc).Len()) diffSummaryValueChanged(ch, size1, size2, func(changeChan chan<- types.ValueChanged, stopChan <-chan struct{}) { v2.Diff(v1, changeChan, stopChan) }) }
func (ds *databaseCommon) commit(datasetID string, commit types.Struct) error { d.PanicIfTrue(!IsCommitType(commit.Type()), "Can't commit a non-Commit struct to dataset %s", datasetID) return ds.doCommit(datasetID, commit) }
// NewCommit creates a new commit object. The type of Commit is computed based on the type of the value, the type of the meta info as well as the type of the parents. // // For the first commit we get: // // ``` // struct Commit { // meta: M, // parents: Set<Ref<Cycle<0>>>, // value: T, // } // ``` // // As long as we continue to commit values with type T and meta of type M that type stays the same. // // When we later do a commit with value of type U and meta of type N we get: // // ``` // struct Commit { // meta: N, // parents: Set<Ref<struct Commit { // meta: M | N, // parents: Set<Ref<Cycle<0>>>, // value: T | U // }>>, // value: U, // } // ``` // // Similarly if we do a commit with a different type for the meta info. // // The new type gets combined as a union type for the value/meta of the inner commit struct. func NewCommit(value types.Value, parents types.Set, meta types.Struct) types.Struct { t := makeCommitType(value.Type(), valueTypesFromParents(parents, ValueField), meta.Type(), valueTypesFromParents(parents, MetaField)) return types.NewStructWithType(t, types.ValueSlice{meta, parents, value}) }