func (bs Bindings) DeleteExcept(keeps ...string) Bindings {
REM:
	for p := range bs {
		for _, keep := range keeps {
			if keep == p {
				continue REM
			}
		}
		delete(bs, p)
	}
	return bs
}
DeleteExcept removes all but the given properties.

Does not copy.
package match
import (
	"errors"
	"strings"
)
type Matcher struct {
	AllowPropertyVariables bool
	CheckForBadPropertyVariables bool
	Inequalities bool
}
var DefaultMatcher = &Matcher{
	AllowPropertyVariables:       true,
	CheckForBadPropertyVariables: true,
	Inequalities:                 true,
}
func (m *Matcher) checkForBadPropertyVariables(pattern map[string]interface{}) error {
	if !m.CheckForBadPropertyVariables {
		return nil
	}
	if len(pattern) <= 1 {
		return nil
	}
	for k := range pattern {
		if m.IsVariable(k) {
			return errors.New(`can't have a variable as a key ("` + k + `") with other keys`)
		}
	}
	return nil
}
// Bindings is a map from variables (strings starting with a '?') to
type Bindings map[string]interface{}
func NewBindings() Bindings {
	return make(Bindings, 8)
}
func (bs Bindings) Extend(p string, v interface{}) Bindings {
	bs[p] = v
	return bs
}
func (bs Bindings) Extendm(pairs ...interface{}) (Bindings, error) {
	for i := 0; i < len(pairs); i += 2 {
		x := pairs[i]
		p, is := x.(string)
		if !is {
			return nil, errors.New("Bindings.Entendm given a non-string key")
		}
		if len(pairs) <= i+1 {
			return nil, errors.New("odd args to Bindings.Extendm")
		}
		bs[p] = pairs[i+1]
	}
	return bs, nil
}
func (bs Bindings) Remove(ps ...string) Bindings {
	for _, p := range ps {
		delete(bs, p)
	}
	return bs
}