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