list_new := ??{ x := { 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'"); } y := nil; if idx == 0 { front { y = value; } } else { front { get_helper(next, idx - 1) {y = x;} } } x := y; }; list_get = ??(list, idx){ if idx < 0 { throw_error("Negative index in 'list_get'"); } y := nil; list { get_helper(front, idx) {y = x;} } x := y; }; }; 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); } }; };