package govaluate

import (
	"bytes"
)

/*
	Holds a series of "transactions" which represent each token as it is output by an outputter (such as ToSQLQuery()).
	Some outputs (such as SQL) require a function call or non-c-like syntax to represent an expression.
	To accomplish this, this struct keeps track of each translated token as it is output, and can return and rollback those transactions.
*/
type expressionOutputStream struct {
	transactions []string
}

func (this *expressionOutputStream) add(transaction string) {
	this.transactions = append(this.transactions, transaction)
}

func (this *expressionOutputStream) rollback() string {

	index := len(this.transactions) - 1
	ret := this.transactions[index]

	this.transactions = this.transactions[:index]
	return ret
}

func (this *expressionOutputStream) createString(delimiter string) string {

	var retBuffer bytes.Buffer
	var transaction string

	penultimate := len(this.transactions) - 1

	for i := 0; i < penultimate; i++ {

		transaction = this.transactions[i]

		retBuffer.WriteString(transaction)
		retBuffer.WriteString(delimiter)
	}
	retBuffer.WriteString(this.transactions[penultimate])

	return retBuffer.String()
}