|
- // 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{}
|