Documentation ¶
Index ¶
- func Walk(s forest.Store, start *fields.QualifiedHash, ...) error
- func WalkNodes(s forest.Store, start forest.Node, visitor func(forest.Node) error) (err error)
- type Archive
- func (m *Archive) Add(node forest.Node) (err error)
- func (m *Archive) AddAs(node forest.Node, addedByID Subscription) (err error)
- func (a *Archive) AncestryOf(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
- func (m *Archive) Children(id *fields.QualifiedHash) (ids []*fields.QualifiedHash, err error)
- func (m *Archive) CopyInto(s forest.Store) (err error)
- func (a *Archive) DescendantsOf(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
- func (m *Archive) Destroy()
- func (m *Archive) Get(id *fields.QualifiedHash) (node forest.Node, present bool, err error)
- func (m *Archive) GetCommunity(id *fields.QualifiedHash) (node forest.Node, present bool, err error)
- func (m *Archive) GetConversation(communityID, conversationID *fields.QualifiedHash) (node forest.Node, present bool, err error)
- func (m *Archive) GetIdentity(id *fields.QualifiedHash) (node forest.Node, present bool, err error)
- func (m *Archive) GetReply(communityID, conversationID, replyID *fields.QualifiedHash) (node forest.Node, present bool, err error)
- func (a *Archive) LeavesOf(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
- func (m *Archive) PresubscribeToNewMessages(handler func(n forest.Node)) (subscriptionID Subscription)
- func (m *Archive) Recent(nodeType fields.NodeType, quantity int) (nodes []forest.Node, err error)
- func (a *Archive) RemoveSubtree(id *fields.QualifiedHash) error
- func (m *Archive) SubscribeToNewMessages(handler func(n forest.Node)) (subscriptionID Subscription)
- func (a *Archive) UnderlyingStore() forest.Store
- func (m *Archive) UnpresubscribeToNewMessages(subscriptionID Subscription)
- func (m *Archive) UnsubscribeToNewMessages(subscriptionID Subscription)
- type CacheStore
- func (m *CacheStore) Add(node forest.Node) error
- func (m *CacheStore) Children(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
- func (m *CacheStore) CopyInto(other forest.Store) error
- func (m *CacheStore) Get(id *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *CacheStore) GetCommunity(id *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *CacheStore) GetConversation(communityID, conversationID *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *CacheStore) GetIdentity(id *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *CacheStore) GetReply(communityID, conversationID, replyID *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *CacheStore) Recent(nodeType fields.NodeType, quantity int) ([]forest.Node, error)
- func (m *CacheStore) RemoveSubtree(id *fields.QualifiedHash) error
- type ExtendedStore
- type MemoryStore
- func (m *MemoryStore) Add(node forest.Node) error
- func (m *MemoryStore) AddID(id string, node forest.Node) error
- func (m *MemoryStore) Children(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
- func (m *MemoryStore) CopyInto(other forest.Store) error
- func (m *MemoryStore) Get(id *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *MemoryStore) GetCommunity(id *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *MemoryStore) GetConversation(communityID, conversationID *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *MemoryStore) GetID(id string) (forest.Node, bool, error)
- func (m *MemoryStore) GetIdentity(id *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *MemoryStore) GetReply(communityID, conversationID, replyID *fields.QualifiedHash) (forest.Node, bool, error)
- func (m *MemoryStore) Recent(nodeType fields.NodeType, quantity int) ([]forest.Node, error)
- func (m *MemoryStore) RemoveSubtree(id *fields.QualifiedHash) error
- type Subscription
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Walk ¶
func Walk(s forest.Store, start *fields.QualifiedHash, visitor func(*fields.QualifiedHash) error) error
Walk traverses the subtree rooted at start in a breadth-first fashion invoking the visitor function on each node id in the subtree. The traversal stops either when the visitor function returns non-nil or when the entire subtree rooted at start has been visited.
If the visitor function returns an error, it will be returned wrapped and can be checked for using the errors.Is or errors.As standard library functions.
Types ¶
type Archive ¶
type Archive struct {
// contains filtered or unexported fields
}
Archive is a wrapper type that extends the store.ExtendedStore interface on top of an existing forest.Store. It is safe for concurrent use.
func NewArchive ¶
func NewArchive(store forest.Store) *Archive
NewArchive creates a thread-safe storage structure for forest nodes by wrapping an existing store implementation
func (*Archive) Add ¶
Add inserts a node into the underlying store. Importantly, this will send a notification of a new node to *all* subscribers. If the calling code is a subscriber, it will still be notified of the new node. To supress this, use AddAs() instead.
Subscribers will only be notified if the node is not already present in the archive.
func (*Archive) AddAs ¶
func (m *Archive) AddAs(node forest.Node, addedByID Subscription) (err error)
AddAs allows adding a node to the underlying store without being notified of it as a new node. The addedByID (subscription id returned from SubscribeToNewMessages) will not be notified of the new nodes, but all other subscribers will be.
Subscribers will only be notified if the node is not already present in the archive.
func (*Archive) AncestryOf ¶
func (a *Archive) AncestryOf(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
AncestryOf returns the IDs of all known ancestors of the node with the given `id`. The ancestors are returned sorted by descending depth, so the root of the ancestry tree is the final node in the slice.
func (*Archive) Children ¶
func (m *Archive) Children(id *fields.QualifiedHash) (ids []*fields.QualifiedHash, err error)
func (*Archive) DescendantsOf ¶
func (a *Archive) DescendantsOf(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
DescendantsOf returns the IDs of all known descendants of the node with the given `id`. The order in which the descendants are returned is undefined.
func (*Archive) Destroy ¶
func (m *Archive) Destroy()
Shut down the worker gorountine that powers this store. Subsequent calls to methods on this MessageStore have undefined behavior
func (*Archive) Get ¶
func (m *Archive) Get(id *fields.QualifiedHash) (node forest.Node, present bool, err error)
func (*Archive) GetCommunity ¶
func (m *Archive) GetCommunity(id *fields.QualifiedHash) (node forest.Node, present bool, err error)
func (*Archive) GetConversation ¶
func (m *Archive) GetConversation(communityID, conversationID *fields.QualifiedHash) (node forest.Node, present bool, err error)
func (*Archive) GetIdentity ¶
func (m *Archive) GetIdentity(id *fields.QualifiedHash) (node forest.Node, present bool, err error)
func (*Archive) GetReply ¶
func (m *Archive) GetReply(communityID, conversationID, replyID *fields.QualifiedHash) (node forest.Node, present bool, err error)
func (*Archive) LeavesOf ¶
func (a *Archive) LeavesOf(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
LeavesOf returns the leaf nodes of the tree rooted at `id`. The order of the returned leaves is undefined.
func (*Archive) PresubscribeToNewMessages ¶
func (m *Archive) PresubscribeToNewMessages(handler func(n forest.Node)) (subscriptionID Subscription)
PresubscribeToNewMessages establishes the given function as a handler to be invoked on each node added to the store. The returned subscription ID can be used to unsubscribe later, as well as to supress notifications with AddAs(). The handler function will be invoked *before* nodes are inserted into the store instead of after (like a normal Subscribe).
Handler functions are invoked synchronously on the same goroutine that invokes Add() or AddAs(), and should not block. If long-running code is needed in a handler, launch a new goroutine.
func (*Archive) Recent ¶
Recent returns recently-created nodes of the provided NodeType. It may return both some nodes and an error
func (*Archive) RemoveSubtree ¶
func (a *Archive) RemoveSubtree(id *fields.QualifiedHash) error
func (*Archive) SubscribeToNewMessages ¶
func (m *Archive) SubscribeToNewMessages(handler func(n forest.Node)) (subscriptionID Subscription)
SubscribeToNewMessages establishes the given function as a handler to be invoked on each node added to the store. The returned subscription ID can be used to unsubscribe later, as well as to supress notifications with AddAs().
Handler functions are invoked synchronously on the same goroutine that invokes Add() or AddAs(), and should not block. If long-running code is needed in a handler, launch a new goroutine.
func (*Archive) UnderlyingStore ¶
func (a *Archive) UnderlyingStore() forest.Store
UnderlyingStore returns the store that powers the archive. Use of this store is not thread-safe unless the concrete store implementation is thread-safe.
func (*Archive) UnpresubscribeToNewMessages ¶
func (m *Archive) UnpresubscribeToNewMessages(subscriptionID Subscription)
UnpresubscribeToNewMessages removes the handler for a given subscription from the store.
func (*Archive) UnsubscribeToNewMessages ¶
func (m *Archive) UnsubscribeToNewMessages(subscriptionID Subscription)
UnsubscribeToNewMessages removes the handler for a given subscription from the store.
type CacheStore ¶
CacheStore combines two other stores into one logical store. It is useful when store implementations have different performance characteristics and one is dramatically faster than the other. Once a CacheStore is created, the individual stores within it should not be directly modified.
func NewCacheStore ¶
func NewCacheStore(cache, back forest.Store) (*CacheStore, error)
NewCacheStore creates a single logical store from the given two stores. All items from `cache` are automatically copied into `base` during the construction of the CacheStore, and from then on (assuming neither store is modified directly outside of CacheStore) all elements added are guaranteed to be added to `base`. It is recommended to use fast in-memory implementations as the `cache` layer and disk or network-based implementations as the `base` layer.
func (*CacheStore) Add ¶
func (m *CacheStore) Add(node forest.Node) error
Add inserts the given node into both stores of the CacheStore
func (*CacheStore) Children ¶
func (m *CacheStore) Children(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
func (*CacheStore) Get ¶
func (m *CacheStore) Get(id *fields.QualifiedHash) (forest.Node, bool, error)
Get returns the requested node if it is present in either the Cache or the Back Store. If the cache is missed by the backing store is hit, the node will automatically be added to the cache.
func (*CacheStore) GetCommunity ¶
func (m *CacheStore) GetCommunity(id *fields.QualifiedHash) (forest.Node, bool, error)
func (*CacheStore) GetConversation ¶
func (m *CacheStore) GetConversation(communityID, conversationID *fields.QualifiedHash) (forest.Node, bool, error)
func (*CacheStore) GetIdentity ¶
func (m *CacheStore) GetIdentity(id *fields.QualifiedHash) (forest.Node, bool, error)
func (*CacheStore) GetReply ¶
func (m *CacheStore) GetReply(communityID, conversationID, replyID *fields.QualifiedHash) (forest.Node, bool, error)
func (*CacheStore) RemoveSubtree ¶
func (m *CacheStore) RemoveSubtree(id *fields.QualifiedHash) error
type ExtendedStore ¶
type ExtendedStore interface { forest.Store SubscribeToNewMessages(handler func(n forest.Node)) Subscription UnsubscribeToNewMessages(Subscription) AddAs(forest.Node, Subscription) (err error) AncestryOf(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error) DescendantsOf(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error) LeavesOf(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error) }
ExtendedStore provides a superset of the functionality of the Store interface, implementing methods for subscribing to changes and querying higher-level structural information like ancestry and descendants.
type MemoryStore ¶
type MemoryStore struct { // Items is a flat map of all nodes. Items map[string]forest.Node // ChildMap describes the parent-child relationship between nodes. // Each list of child nodes is keyed by the parent node. ChildMap map[string][]string }
MemoryStore is an in-memory node store.
func (*MemoryStore) Children ¶
func (m *MemoryStore) Children(id *fields.QualifiedHash) ([]*fields.QualifiedHash, error)
func (*MemoryStore) Get ¶
func (m *MemoryStore) Get(id *fields.QualifiedHash) (forest.Node, bool, error)
func (*MemoryStore) GetCommunity ¶
func (m *MemoryStore) GetCommunity(id *fields.QualifiedHash) (forest.Node, bool, error)
func (*MemoryStore) GetConversation ¶
func (m *MemoryStore) GetConversation(communityID, conversationID *fields.QualifiedHash) (forest.Node, bool, error)
func (*MemoryStore) GetIdentity ¶
func (m *MemoryStore) GetIdentity(id *fields.QualifiedHash) (forest.Node, bool, error)
func (*MemoryStore) GetReply ¶
func (m *MemoryStore) GetReply(communityID, conversationID, replyID *fields.QualifiedHash) (forest.Node, bool, error)
func (*MemoryStore) Recent ¶
Recent returns a slice of len `quantity` (or fewer) nodes of the given type. These nodes are the most recent (by creation time) nodes of that type known to the store.
func (*MemoryStore) RemoveSubtree ¶
func (m *MemoryStore) RemoveSubtree(id *fields.QualifiedHash) error
type Subscription ¶
type Subscription uint
Subscription is an identifier for a particular handler function within a SubscriberStore. It can be provided to delete a handler function or to suppress notifications to the corresponding handler.