github.com/mavryk-network/mvgo@v1.19.9/internal/parse/cache.go (about) 1 package parse 2 3 import ( 4 "encoding/json" 5 "hash/fnv" 6 7 "github.com/mavryk-network/mvgo/contract/ast" 8 ) 9 10 type Cache struct { 11 data map[uint64]*ast.Struct 12 } 13 14 func NewCache() *Cache { 15 return &Cache{ 16 data: make(map[uint64]*ast.Struct), 17 } 18 } 19 20 func (c *Cache) CacheStruct(newStruct *ast.Struct) error { 21 id, err := c.hash(newStruct) 22 if err != nil { 23 return err 24 } 25 if _, ok := c.data[id]; !ok { 26 c.data[id] = newStruct 27 } 28 return nil 29 } 30 31 func (c *Cache) IsCached(newStruct *ast.Struct) (*ast.Struct, bool) { 32 id, err := c.hash(newStruct) 33 if err != nil { 34 return nil, false 35 } 36 s, ok := c.data[id] 37 return s, ok 38 } 39 40 func (c *Cache) hash(newStruct *ast.Struct) (uint64, error) { 41 h := fnv.New64() 42 b, err := json.Marshal(newStruct) 43 if err != nil { 44 return 0, err 45 } 46 h.Write(b) 47 return h.Sum64(), nil 48 }