func (s *Store) Put(k Key, v Value) {
	s.names[k] = v
	s.logger.Printf("Put: %s ↦ %v\t%s", k.Name(), v.UniqName(), k.Type())
}
Put inserts an existing value v with the new key k.
package store
import (
	"bytes"
	"fmt"
	"go/token"
	"go/types"
	"io"
	"io/ioutil"
	"log"
	"golang.org/x/tools/go/ssa"
)
type Key interface {
	Name() string      
	Pos() token.Pos    
	String() string    
	Type() types.Type  
}
type Value interface {
	UniqName() string
}
type Store struct {
	logger *log.Logger
	names  map[Key]Value
	vals   *Pool  
}
func New() *Store {
	return &Store{
		logger: log.New(ioutil.Discard, "store: ", 0),
		names:  make(map[Key]Value),
		vals:   newPool(),
	}
}
func Extend(s *Store) *Store {
	return &Store{
		logger: s.logger,
		names:  make(map[Key]Value),
		vals:   s.vals,
	}
}
func (s *Store) Get(k Key) Value {
	if v, ok := s.names[k]; ok {
		s.logger.Printf("Get: %s ↦ %v\t%s", k.Name(), v.UniqName(), k.Type())
		return v
	}
	if c, ok := k.(*ssa.Const); ok {
		s.logger.Printf("Get const: %s ↦ %v\t%s", k.Name(), c.String(), k.Type())
		return getConst(c)
	}
	s.logger.Printf("Get: %s ↦ (not found)\t%s", k.Name(), k.Type())
	return MockValue{SrcPos: k.Pos(), Description: "Undefined"}
}