package main

import (
	"fmt"
)

export{
 	"T": type{int, uint, struct{type, type, int}},
	"syncable": type{$T, bool, sync.Mutex}
}

type syncer interface{
	sync($T) $syncable
}

type queue($T) []$T

func (q *queue($T)) enqueue(v $T) {
	*q = append(*q, v)
}

func (q *queue($syncable)) dequeue() ($syncable, bool) {
	if len(*q) == 0 {
		var zero $syncable
		return zero, false
	}
	r := (*q)[0]
	*q = (*q)[1:]
	return r, true
}

func main() {
	q := new(queue(int))
	q.enqueue(5)
	q.enqueue(6)
	fmt.Println(q)
	fmt.Println(q.dequeue())
	fmt.Println(q.dequeue())
	fmt.Println(q.dequeue())
}