41 lines
837 B
Go
41 lines
837 B
Go
package main
|
|
|
|
type PredicateDict struct {
|
|
idByIRI map[string]uint32
|
|
iriByID []string
|
|
}
|
|
|
|
func NewPredicateDict(predicates []string) *PredicateDict {
|
|
idByIRI := make(map[string]uint32, len(predicates))
|
|
iriByID := make([]string, 0, len(predicates))
|
|
for _, iri := range predicates {
|
|
if iri == "" {
|
|
continue
|
|
}
|
|
if _, ok := idByIRI[iri]; ok {
|
|
continue
|
|
}
|
|
id := uint32(len(iriByID))
|
|
idByIRI[iri] = id
|
|
iriByID = append(iriByID, iri)
|
|
}
|
|
return &PredicateDict{idByIRI: idByIRI, iriByID: iriByID}
|
|
}
|
|
|
|
func (d *PredicateDict) GetOrAdd(iri string) (uint32, bool) {
|
|
if iri == "" {
|
|
return 0, false
|
|
}
|
|
if id, ok := d.idByIRI[iri]; ok {
|
|
return id, true
|
|
}
|
|
id := uint32(len(d.iriByID))
|
|
d.idByIRI[iri] = id
|
|
d.iriByID = append(d.iriByID, iri)
|
|
return id, true
|
|
}
|
|
|
|
func (d *PredicateDict) IRIs() []string {
|
|
return d.iriByID
|
|
}
|