package shlex

import (
	
)

type TokenSlice []Token

func ( TokenSlice) () []string {
	 := make([]string, 0, len())
	for ,  := range  {
		 = append(, .Value)
	}
	return 
}

func ( TokenSlice) () []TokenSlice {
	 := make([]TokenSlice, 0)

	 := make(TokenSlice, 0)
	for ,  := range  {
		switch {
		case .Type == WORDBREAK_TOKEN && wordbreakType().IsPipelineDelimiter():
			 = append(, )
			 = make(TokenSlice, 0)
		default:
			 = append(, )
		}
	}
	return append(, )
}

func ( TokenSlice) () TokenSlice {
	 := .Pipelines()
	return [len()-1]
}

func ( TokenSlice) () TokenSlice {
	 := make(TokenSlice, 0)
	for ,  := range  {
		switch {
		case  == 0:
			 = append(, )
		case [-1].adjoins():
			[len()-1].Value += .Value
			[len()-1].RawValue += .RawValue
			[len()-1].State = .State
		default:
			 = append(, )
		}
	}
	return 
}

func ( TokenSlice) () TokenSlice {
	 := make(TokenSlice, 0)
	for ,  := range  {
		switch .Type {
		case WORDBREAK_TOKEN:
			if wordbreakType().IsRedirect() {
				continue
			}
		}

		if  > 0 {
			if wordbreakType([-1]).IsRedirect() {
				continue
			}
		}

		if  < len()-1 {
			 := [+1]
			if .adjoins() {
				if ,  := strconv.Atoi(.RawValue);  == nil {
					if wordbreakType([+1]).IsRedirect() {
						continue
					}
				}
			}

		}

		 = append(, )
	}
	return 
}

func ( TokenSlice) () ( Token) {
	if len() > 0 {
		 = [len()-1]
	}
	return
}

func ( TokenSlice) () string {
	 := false
	 := ""

	 := [len()-1]
	switch .State {
	case QUOTING_STATE, QUOTING_ESCAPING_STATE, ESCAPING_QUOTED_STATE:
		// Seems bash handles the last opening quote as wordbreak when in quoting state.
		// So add value up to last opening quote to prefix.
		 = true
		 = .Value[:.WordbreakIndex]
	}

	for  := len() - 2;  >= 0; -- {
		 := []
		if !.adjoins([+1]) {
			break
		}

		if .Type == WORDBREAK_TOKEN {
			 = true
		}

		if  {
			 = .Value + 
		}
	}
	return 
}