property Pool<T> { ... }, function first<T>(xs: []T) -> T, map<T, U> over fn
types; a type writes an instance as Pool<Thing>, nested as deep as needed. The
parser names an instance Pool$Thing and remembers its generic and arguments; the
checker takes the generic declarations out, infers a call's type arguments from
its arguments or its result's declared slot, and makes each instance once as an
ordinary record or function, checked like any other. Errors print Pool<Thing>.
An instance keeps its generic's module and export (L3). ludic-fmt keeps type
arguments together while spacing comparisons and shifts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 lines
290 B
Text
11 lines
290 B
Text
export property Pool<T> {
|
|
items: []T = null
|
|
}
|
|
function grow<T>(p: Pool<T>) -> void {
|
|
if p.items == null { p.items = new []T }
|
|
}
|
|
export function pool_add<T>(p: Pool<T>, x: T) -> void {
|
|
grow(p)
|
|
push(p.items, x)
|
|
}
|
|
export function pool_len<T>(p: Pool<T>) -> int { return len(p.items) }
|