list_new := ??{ x := { front := nil back := nil } } list_push_front := ??(list, item){ list { if front == nil then { front = { value := item next := nil prev := nil } back = front } else { front = { value := item next := front prev := nil } } } } list_push_back := ??(list, item){ list { if back == nil then { front = { value := item next := nil prev := nil } back = front } else { back = { value := item next := nil prev := back } } } } list_pop_front := ??(list){ x := nil list { if front == nil then { throw_error("Call to 'list_pop_front' on empty list") } else {} front { x = value front = next } if front == nil then { back = nil } else {} } } list_pop_back := ??(list){ x := nil list { if back == nil then { throw_error("Call to 'list_pop_back' on empty list") } else {} back { x = value back = prev } if back == nil then { front = nil } else {} } } list_get := nil { get_helper := ??(front, idx){ if front == nil then { throw_error("Index past end of list in 'list_get'") } else {} x := nil if idx == 0 then { front { x = value } } else { front { x = get_helper(next, idx - 1) } } } list_get = ??(list, idx){ if idx < 0 then { throw_error("Negative index in 'list_get'") } else {} x := nil list { x = get_helper(front, idx) } } } list_set := nil { set_helper := ??(front, idx, val){ if front == nil then { throw_error("Index past end of list in 'list_set'") } else {} if idx == 0 then { front { value = val } } else { front { set_helper(next, idx - 1, val) } } } list_set = ??(list, idx, val){ if idx < 0 then { throw_error("Negative index in 'list_set'") } else {} list { set_helper(front, idx, val) } } }