package completion

import (
	
)

// RawValues is a list of completion candidates.
type RawValues []Candidate

// Filter filters values.
func ( RawValues) ( ...string) RawValues {
	 := make(map[string]bool)
	for ,  := range  {
		[] = true
	}

	 := make([]Candidate, 0)

	for ,  := range  {
		if ,  := [.Value]; ! {
			 = append(, )
		}
	}

	return 
}

// Merge merges a set of values with the current ones,
// include usage/message strings, meta settings, etc.
func ( *Values) ( Values) {
	if .Usage != "" {
		.Usage = .Usage
	}

	.NoSpace.Merge(.NoSpace)
	.Messages.Merge(.Messages)

	for  := range .ListLong {
		if ,  := .ListLong[]; ! {
			.ListLong[] = true
		}
	}
}

// EachTag iterates over each tag and runs a function for each group.
func ( RawValues) ( func( string,  RawValues)) {
	 := make([]string, 0)
	 := make(map[string]RawValues)

	for ,  := range  {
		if ,  := [.Tag]; ! {
			[.Tag] = make(RawValues, 0)

			 = append(, .Tag)
		}

		[.Tag] = append([.Tag], )
	}

	for ,  := range  {
		(, [])
	}
}

// FilterPrefix filters values with given prefix.
// If matchCase is false, the filtering is made case-insensitive.
// This function ensures that all spaces are correctly.
func ( RawValues) ( string,  bool) RawValues {
	if  == "" {
		return 
	}

	 := make(RawValues, 0)

	if ! {
		 = strings.ToLower()
	}

	for ,  := range  {
		 := .Value

		if ! {
			 = strings.ToLower()
		}

		if strings.HasPrefix(, ) {
			 = append(, )
		}
	}

	return 
}

func ( RawValues) () int { return len() }

func ( RawValues) (,  int) { [], [] = [], [] }

func ( RawValues) (,  int) bool {
	return strings.ToLower([].Value) < strings.ToLower([].Value)
}