forked from gitea/gitea
60 lines
2.1 KiB
Go
60 lines
2.1 KiB
Go
// Package noder provide an interface for defining nodes in a
|
|
// merkletrie, their hashes and their paths (a noders and its
|
|
// ancestors).
|
|
//
|
|
// The hasher interface is easy to implement naively by elements that
|
|
// already have a hash, like git blobs and trees. More sophisticated
|
|
// implementations can implement the Equal function in exotic ways
|
|
// though: for instance, comparing the modification time of directories
|
|
// in a filesystem.
|
|
package noder
|
|
|
|
import "fmt"
|
|
|
|
// Hasher interface is implemented by types that can tell you
|
|
// their hash.
|
|
type Hasher interface {
|
|
Hash() []byte
|
|
}
|
|
|
|
// Equal functions take two hashers and return if they are equal.
|
|
//
|
|
// These functions are expected to be faster than reflect.Equal or
|
|
// reflect.DeepEqual because they can compare just the hash of the
|
|
// objects, instead of their contents, so they are expected to be O(1).
|
|
type Equal func(a, b Hasher) bool
|
|
|
|
// The Noder interface is implemented by the elements of a Merkle Trie.
|
|
//
|
|
// There are two types of elements in a Merkle Trie:
|
|
//
|
|
// - file-like nodes: they cannot have children.
|
|
//
|
|
// - directory-like nodes: they can have 0 or more children and their
|
|
// hash is calculated by combining their children hashes.
|
|
type Noder interface {
|
|
Hasher
|
|
fmt.Stringer // for testing purposes
|
|
// Name returns the name of an element (relative, not its full
|
|
// path).
|
|
Name() string
|
|
// IsDir returns true if the element is a directory-like node or
|
|
// false if it is a file-like node.
|
|
IsDir() bool
|
|
// Children returns the children of the element. Note that empty
|
|
// directory-like noders and file-like noders will both return
|
|
// NoChildren.
|
|
Children() ([]Noder, error)
|
|
// NumChildren returns the number of children this element has.
|
|
//
|
|
// This method is an optimization: the number of children is easily
|
|
// calculated as the length of the value returned by the Children
|
|
// method (above); yet, some implementations will be able to
|
|
// implement NumChildren in O(1) while Children is usually more
|
|
// complex.
|
|
NumChildren() (int, error)
|
|
}
|
|
|
|
// NoChildren represents the children of a noder without children.
|
|
var NoChildren = []Noder{}
|