71 lines
1.1 KiB
Go
71 lines
1.1 KiB
Go
package bkl
|
|
|
|
import (
|
|
"github.com/gopatchy/bkl/polyfill"
|
|
"go.jetpack.io/typeid"
|
|
)
|
|
|
|
type Document struct {
|
|
ID typeid.TypeID
|
|
Parents []*Document
|
|
Data any
|
|
}
|
|
|
|
func NewDocument() *Document {
|
|
return &Document{
|
|
ID: typeid.Must(typeid.New("doc")),
|
|
}
|
|
}
|
|
|
|
func NewDocumentWithData(data any) *Document {
|
|
doc := NewDocument()
|
|
doc.Data = data
|
|
return doc
|
|
}
|
|
|
|
func (d *Document) AddParents(parents ...*Document) {
|
|
d.Parents = append(d.Parents, parents...)
|
|
}
|
|
|
|
func (d *Document) AllParents() []*Document {
|
|
parents := map[typeid.TypeID]*Document{}
|
|
|
|
for _, parent := range d.Parents {
|
|
parents[parent.ID] = parent
|
|
|
|
for _, doc := range parent.AllParents() {
|
|
parents[doc.ID] = doc
|
|
}
|
|
}
|
|
|
|
return polyfill.MapsValues(parents)
|
|
}
|
|
|
|
func (d *Document) DataAsMap() map[string]any {
|
|
dataMap, ok := d.Data.(map[string]any)
|
|
if ok {
|
|
return dataMap
|
|
} else {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func (d *Document) PopMapValue(key string) (bool, any) {
|
|
dataMap := d.DataAsMap()
|
|
if dataMap == nil {
|
|
return false, nil
|
|
}
|
|
|
|
found, val, data := popMapValue(dataMap, key)
|
|
|
|
if found {
|
|
d.Data = data
|
|
}
|
|
|
|
return found, val
|
|
}
|
|
|
|
func (d *Document) String() string {
|
|
return d.ID.String()
|
|
}
|