Generics announced after the name, each saying what it accepts.
interface_types.zg
# Generics announced after the name, each saying what it accepts (owner, 2026-10-02). An interface# may list types, one per line, as well as operations; a blank may need several, joined with `and`;# lifetime groups come after the generics, a `|` between the two kinds.interfaceNumber{int32int64bin64}interfaceOrdered<T>{op<['a':<T>,'b':<T>]->bool;opequal_to['a':<T>,'b':<T>]->bool;}interfaceWholeOrdered<T>{int32int64op<['a':<T>,'b':<T>]->bool;}fnbigger<T:NumberandOrdered>['a':<T>,'b':<T>]-><T>{if'b'<'a'{return'a';}return'b';}fnsmaller<T:WholeOrdered>['a':<T>,'b':<T>]-><T>{if'a'<'b'{return'a';}return'b';}fnwhole<T:any>[@x][lent@x'xs':list[<T>]]->lent@xlist[<T>]{returnlend'xs';}structBox<T:Number>{item:<T>}MAIN{std::print.useful[bigger[3,9]," ",bigger[2.5,1.5]," ",smaller[3,9],newln];let'xs':=["a","b"];std::print.useful[whole[lend'xs'],newln];let'b':Box[int32]=Box[item=4];std::print.useful['b'.item,newln];}