package main

import (
	"sync"
)

type UniqueFifo struct {
    slice []string
	mu sync.Mutex
	size int
}


func newUniqueFifo(size int) *UniqueFifo {
    q := UniqueFifo{}
    q.slice = make([]string, 0)
	q.size = size
    return &q
}

func (q *UniqueFifo) Add(v string) bool {
	ret := false
	if len(q.slice) == 0 {
		q.slice = append(q.slice, v)
//logDebug.Print("Condition 1 for ", v)
		ret = false
	} else {
		i := q.Contains(v)
		if i != -1 {
			q.Remove(i)
//logDebug.Print("Condition 2 for ", v)
			ret = true
		} else {
//logDebug.Print("Condition 3 for ", v)
			ret = false
		}
		q.slice = append(q.slice, "")
		copy(q.slice[1:], q.slice)
		q.slice[0] = v
		if len(q.slice) <= q.size {
			q.slice = q.slice[:len(q.slice)]
		} else {
			q.slice = q.slice[:q.size]
		}
	}

	return ret
}

func (q *UniqueFifo) Remove(r int) {
	f := q.slice[:r]
	e := q.slice[r+1:]
	q.slice = f
	q.slice = append(q.slice, e...)
}


func (q *UniqueFifo) Contains(v string) int {
	for i, val := range q.slice {
		if val == v {
			return i
		}
	}
	return -1
}

/*
func main() {
	u := newUniqueFifo(3)
	u.Add("First")
	u.Add("First")
	fmt.Println(u)
	u.Add("Second")
	fmt.Println(u)
	u.Add("First")
	fmt.Println(u)
	u.Add("Third")
	fmt.Println(u)
	u.Add("Fourth")
	fmt.Println(u)
}
*/