func Remove(s Set) Transformer {
	if f, ok := s.(setFunc); ok {
		return Transformer{remove(f)}
	}
	return Transformer{remove(s.Contains)}
}
Remove returns a Transformer that removes runes r for which s.Contains(r).
Illegal input bytes are replaced by RuneError before being passed to f.
package runes  
import (
	"unicode"
	"unicode/utf8"
	"golang.org/x/text/transform"
)
type Set interface {
	Contains(r rune) bool
}
type setFunc func(rune) bool
func (s setFunc) Contains(r rune) bool {
	return s(r)
}
func In(rt *unicode.RangeTable) Set {
	return setFunc(func(r rune) bool { return unicode.Is(rt, r) })
}
func NotIn(rt *unicode.RangeTable) Set {
	return setFunc(func(r rune) bool { return !unicode.Is(rt, r) })
}
func Predicate(f func(rune) bool) Set {
	return setFunc(f)
}
type Transformer struct {
	t transform.SpanningTransformer
}
func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
	return t.t.Transform(dst, src, atEOF)
}
func (t Transformer) Span(b []byte, atEOF bool) (n int, err error) {
	return t.t.Span(b, atEOF)
}
func (t Transformer) Reset() { t.t.Reset() }
func (t Transformer) Bytes(b []byte) []byte {
	b, _, err := transform.Bytes(t, b)
	if err != nil {
		return nil
	}
	return b
}
func (t Transformer) String(s string) string {
	s, _, err := transform.String(t, s)
	if err != nil {
		return ""
	}
	return s
}
const runeErrorString = string(utf8.RuneError)