# Collaborative Objects
Collaborative objects are graphs of CRDTs.
## Basic Types
The basic types that are found in `radicle-cob` are:
* [`CollaborativeObject`] -- the computed object itself.
* [`ObjectId`] -- the content-address for a single collaborative object.
* [`TypeName`] -- the name for a collection of collaborative objects.
* [`History`] -- the traversable history of the changes made to
a single collaborative object.
## CRU Interface (No Delete)
The main entry for manipulating [`CollaborativeObject`]s is by
using the CRU like functions:
* [`create`]
* [`get`]
* [`list`]
* [`update`]
## Storage
The storing of collaborative objects is based on a git
backend. The previously mentioned functions all accept a [`Store`]
as parameter. The `Store` itself is an accumulation of different
storage capabilities:
* [`object::Storage`]
* [`change::Storage`] -- **Note**: there is already an
implementation for this for [`git2::Repository`] for convenience.
## Resource
The [`create`] and [`update`] functions take a `Resource`. It
represents the type of resource the collaborative objects are
relating to, for example a software project.
## History Traversal
The [`History`] of a [`CollaborativeObject`] -- accessed via
[`CollaborativeObject::history`] -- has a method
[`History::traverse`] which provides a way of inspecting each
[`Entry`] and building up a final value.
This traversal is also the point at which the [`Entry::author`]
and [`Entry::resource`] can be retrieved to apply any kind of
filtering logic. For example, a specific `author`'s change may be
egregious, spouting terrible libel about Radicle. It is at this
point that the `actor`'s change can be filtered out from the
final product of the traversal.