package strutil

import (
	
	

	
)

// SimilarComparator definition
//
// links:
//
//	https://github.com/mkideal/cli/blob/master/fuzzy.go
type SimilarComparator struct {
	src, dst string
}

// NewComparator create
func (,  string) *SimilarComparator {
	return &SimilarComparator{, }
}

// Similarity calc for two string.
//
// Usage:
//
//	rate, ok := Similarity("hello", "he")
func (,  string,  float32) (float32, bool) {
	return NewComparator(, ).Similar()
}

// Similar by minDifferRate
//
// Usage:
//
//	c := NewComparator("hello", "he")
//	rate, ok :c.Similar(0.3)
func ( *SimilarComparator) ( float32) (float32, bool) {
	 := .editDistance([]byte(.src), []byte(.dst))
	 :=  / float32(mathutil.Max(len(.src), len(.dst))+4)

	return ,  >= 
}

func ( *SimilarComparator) (,  []byte) float32 {
	var (
		 = len()
		 = len()
		 = make([][]float32, +1)
	)
	for  := 0;  < +1; ++ {
		[] = make([]float32, +1)
		[][0] = float32()
	}
	for  := 0;  < +1; ++ {
		[0][] = float32()
	}

	for  := 1;  < +1; ++ {
		for  := 1;  < +1; ++ {
			if [-1] == [-1] {
				[][] = [-1][-1]
			} else {
				[][] = mathutil.Min([-1][]+1, mathutil.Min([][-1]+1, [-1][-1]+1))
			}
		}
	}

	return [][]
}

// Builder struct
type Builder struct {
	strings.Builder
}

// Write bytes and no error report
func ( *Builder) ( []byte) {
	_, _ = .Builder.Write()
}

// WriteRune and no error report
func ( *Builder) ( rune) {
	_, _ = .Builder.WriteRune()
}

// WriteByteNE write byte and no error report
func ( *Builder) ( byte) {
	_ = .WriteByte()
}

// WriteString to builder
func ( *Builder) ( string) {
	_, _ = .Builder.WriteString()
}

// Writef write string by fmt.Sprintf formatted
func ( *Builder) ( string,  ...any) {
	_, _ = .Builder.WriteString(fmt.Sprintf(, ...))
}

// Writeln write string with newline.
func ( *Builder) ( string) {
	_, _ = .Builder.WriteString()
	_ = .WriteByte('\n')
}

// WriteAny write any type value.
func ( *Builder) ( any) {
	_, _ = .Builder.WriteString(QuietString())
}

// WriteAnys write any type values.
func ( *Builder) ( ...any) {
	for ,  := range  {
		_, _ = .Builder.WriteString(QuietString())
	}
}

// WriteMulti write multi byte at once.
func ( *Builder) ( ...byte) {
	for ,  := range  {
		_ = .WriteByte()
	}
}

// WriteStrings write multi string at once.
func ( *Builder) ( ...string) {
	for ,  := range  {
		_, _ = .Builder.WriteString()
	}
}

// ResetGet return current string and reset builder
func ( *Builder) () string {
	 := .String()
	.Reset()
	return 
}