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