57 lines
882 B
Go
57 lines
882 B
Go
|
package diffsync
|
||
|
|
||
|
import "sync"
|
||
|
|
||
|
type Version uint64
|
||
|
|
||
|
type void struct{}
|
||
|
|
||
|
type Document struct {
|
||
|
content []byte
|
||
|
patcher Patcher
|
||
|
differ Differ
|
||
|
peers map[*Peer]void
|
||
|
peersMutex sync.RWMutex
|
||
|
}
|
||
|
|
||
|
func (d *Document) NewPeer() *Peer {
|
||
|
d.peersMutex.Lock()
|
||
|
defer d.peersMutex.Unlock()
|
||
|
|
||
|
p := &Peer{
|
||
|
document: d,
|
||
|
shadow: NewShadow(Copy(d.content)),
|
||
|
editsStack: make(EditsStack, 0),
|
||
|
}
|
||
|
|
||
|
d.peers[p] = void{}
|
||
|
|
||
|
return p
|
||
|
}
|
||
|
|
||
|
func (d *Document) RemovePeer(p *Peer) {
|
||
|
d.peersMutex.Lock()
|
||
|
defer d.peersMutex.Unlock()
|
||
|
|
||
|
delete(d.peers, p)
|
||
|
p.document = nil
|
||
|
}
|
||
|
|
||
|
func (d *Document) Content() []byte {
|
||
|
return d.content
|
||
|
}
|
||
|
|
||
|
func NewDocument(content []byte, funcs ...OptionFunc) *Document {
|
||
|
opt := MergeOption(
|
||
|
DefaultOption(),
|
||
|
funcs...,
|
||
|
)
|
||
|
|
||
|
return &Document{
|
||
|
content: content,
|
||
|
patcher: opt.Patcher,
|
||
|
differ: opt.Differ,
|
||
|
peers: make(map[*Peer]void),
|
||
|
}
|
||
|
}
|