class Buffer[T] { val data:Rail[T]; var slots:Int; var r:Int=0, w:Int=0; val size:Int; def this(n:Int, init:T){ slots=n; data = new Rail[T](n, (int)=>init); size=n; } def put(t:T) { when (slots > 0) { slots--; data(w)=t; } w++; if (w==size) w=0; } def get():T { var result:T; when (slots < size) { slots++; result=data(r); } r++; if (r==size) r=0; return result; } }