package container Ring :: struct($T: typeid) { next, prev: ^Ring(T), value: T, } ring_init :: proc(r: ^$R/Ring) -> ^R { r.prev, r.next = r, r return r } ring_next :: proc(r: ^$R/Ring) -> ^R { if r.next == nil { return ring_init(r) } return r.next } ring_prev :: proc(r: ^$R/Ring) -> ^R { if r.prev == nil { return ring_init(r) } return r.prev } ring_move :: proc(r: ^$R/Ring, n: int) -> ^R { r := r if r.next == nil { return ring_init(r) } switch { case n < 0: for _ in n..<0 { r = r.prev } case n > 0: for _ in 0.. ^R { n := ring_next(r) if s != nil { p := ring_prev(s) r.next = s s.prev = r n.prev = p p.next = n } return n } ring_unlink :: proc(r: ^$R/Ring, n: int) -> ^R { if n <= 0 { return nil } return ring_link(r, ring_move(r, n+1)) } ring_len :: proc(r: ^$R/Ring) -> int { n := 0 if r != nil { n = 1 for p := ring_next(r); p != r; p = p.next { n += 1 } } return n }