func NewChainProcessor(processors ...Processor) ProcessorFunc {
	return func(in string) (string, bool) {
		out := in
		ok := true
		for _, processor := range processors {
			out, ok = processor.Process(out)
			if !ok {
				return "", false
			}
		}
		return out, ok
	}
}
--------------------
FACTORIES
--------------------
NewChainProcessor creates a processor chaning the passed processors.
package stringex
import (
	"fmt"
	"regexp"
	"strings"
)
type Processor interface {
	Process(in string) (string, bool)
}
type ProcessorFunc func(in string) (string, bool)
func (pf ProcessorFunc) Process(in string) (string, bool) {
	return pf(in)
}
func WrapProcessorFunc(f func(fin string) string) ProcessorFunc {
	return func(in string) (string, bool) {
		return f(in), true
	}
}
func errorProcessorFunc(err error) ProcessorFunc {
	return func(in string) (string, bool) {
		return fmt.Sprintf("error processing '%s': %v", in, err), false
	}
}