HATEBIN
>
type PooledRef[T] = distinct int MyPool[T] = object # Generic does not really work cause we can never implement `=destroy` in another module :( pool: seq[PooledRef[T]] data: seq[T] var myPool = MyPool[(int, string)]() proc `=destroy`(myRef: PooledRef[(int, string)]) = myPool.pool.add myRef reset myPool.data[int myRef] proc new*(_: typedesc[PooledRef[(int, string)]]): PooledRef[(int, string)] = if myPool.pool.len > 0: myPool.pool.pop else: myPool.data.add default((int, string)) PooledRef[(int, string)](myPool.data.high) proc `[]=`*(myRef: PooledRef[(int, string)], ind: static int, val: auto) = myPool.data[int myRef][ind] = val proc doThing() = let myRef = new PooledRef[(int, string)] echo int myRef myRef[1] = "hello" proc main() = let myRef = new PooledRef[(int, string)] echo int myRef myRef[1] = "hmm" doThing() doThing() main()