package aec import ( "fmt" "strings" ) const esc = "\x1b[" // Reset resets SGR effect. const Reset string = "\x1b[0m" var empty = newAnsi("") // ANSI represents ANSI escape code. type ANSI interface { fmt.Stringer // With adapts given ANSIs. With(...ANSI) ANSI // Apply wraps given string in ANSI. Apply(string) string } type ansiImpl string func newAnsi(s string) *ansiImpl { r := ansiImpl(s) return &r } func (a *ansiImpl) With(ansi ...ANSI) ANSI { return concat(append([]ANSI{a}, ansi...)) } func (a *ansiImpl) Apply(s string) string { return a.String() + s + Reset } func (a *ansiImpl) String() string { return string(*a) } // Apply wraps given string in ANSIs. func Apply(s string, ansi ...ANSI) string { if len(ansi) == 0 { return s } return concat(ansi).Apply(s) } func concat(ansi []ANSI) ANSI { strs := make([]string, 0, len(ansi)) for _, p := range ansi { strs = append(strs, p.String()) } return newAnsi(strings.Join(strs, "")) }