diff options
author | Michael Muré <batolettre@gmail.com> | 2022-12-22 00:48:00 +0100 |
---|---|---|
committer | Michael Muré <batolettre@gmail.com> | 2022-12-22 00:48:00 +0100 |
commit | d65e8837aa7bb1a6abb6892b9f2664e1b7edb02e (patch) | |
tree | 331b05b689182b4d2bf43fd7cf92ca03b055bff0 /cache/with_snapshot.go | |
parent | 9b98fc06489353053564b431ac0c0d73a5c55a56 (diff) | |
download | git-bug-d65e8837aa7bb1a6abb6892b9f2664e1b7edb02e.tar.gz |
cache: generic withSnapshot, some cleanup
Diffstat (limited to 'cache/with_snapshot.go')
-rw-r--r-- | cache/with_snapshot.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/cache/with_snapshot.go b/cache/with_snapshot.go new file mode 100644 index 00000000..674b6923 --- /dev/null +++ b/cache/with_snapshot.go @@ -0,0 +1,56 @@ +package cache + +import ( + "sync" + + "github.com/MichaelMure/git-bug/entity/dag" + "github.com/MichaelMure/git-bug/repository" +) + +var _ dag.Interface[dag.Snapshot, dag.OperationWithApply[dag.Snapshot]] = &withSnapshot[dag.Snapshot, dag.OperationWithApply[dag.Snapshot]]{} + +// withSnapshot encapsulate an entity and maintain a snapshot efficiently. +type withSnapshot[SnapT dag.Snapshot, OpT dag.OperationWithApply[SnapT]] struct { + dag.Interface[SnapT, OpT] + mu sync.Mutex + snap *SnapT +} + +func (ws *withSnapshot[SnapT, OpT]) Compile() SnapT { + ws.mu.Lock() + defer ws.mu.Unlock() + if ws.snap == nil { + snap := ws.Interface.Compile() + ws.snap = &snap + } + return *ws.snap +} + +// Append intercept Bug.Append() to update the snapshot efficiently +func (ws *withSnapshot[SnapT, OpT]) Append(op OpT) { + ws.mu.Lock() + defer ws.mu.Unlock() + + ws.Interface.Append(op) + + if ws.snap == nil { + return + } + + op.Apply(*ws.snap) + (*ws.snap).AppendOperation(op) +} + +// Commit intercept Bug.Commit() to update the snapshot efficiently +func (ws *withSnapshot[SnapT, OpT]) Commit(repo repository.ClockedRepo) error { + ws.mu.Lock() + defer ws.mu.Unlock() + + err := ws.Interface.Commit(repo) + if err != nil { + ws.snap = nil + return err + } + + return nil +} |