{"record":{"id":"d41bbf02f4add07b","repo":"krahets/hello-algo","slug":"deque-is-empty","errorCode":null,"errorMessage":"Deque is empty","messagePattern":"Deque is empty","errorType":"exception","errorClass":"IndexError","httpStatus":null,"severity":"error","filePath":"en/codes/ruby/chapter_stack_and_queue/array_deque.rb","lineNumber":76,"sourceCode":"  ### Dequeue from front ###\n  def pop_first\n    num = peek_first\n    # Move front pointer backward by one position\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### Dequeue from rear ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### Access front element ###\n  def peek_first\n    raise IndexError, 'Deque is empty' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### Access rear element ###\n  def peek_last\n    raise IndexError, 'Deque is empty' if is_empty?\n\n    # Initialize double-ended queue\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### Return array for printing ###\n  def to_array\n    # Elements enqueue\n    res = []\n    for i in 0...size","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/krahets/hello-algo/blob/69932aed1891a7b7f6a0de88cd116d3fe13e7032/en/codes/ruby/chapter_stack_and_queue/array_deque.rb#L58-L94","documentation":"Raised by `ArrayDeque#peek_first` (array_deque.rb:76, English version) when `is_empty?` is true. Reads `@nums[@front]`; on an empty deque `@front` is stale and the slot is uninitialized, so the guard prevents returning garbage. Note: the overflow path (`push_first`/`push_last` when full) only prints and returns — overflow is silent, but empty access raises.","triggerScenarios":"Calling `deque.peek_first` or `deque.pop_first` (delegates via `peek_first`) on an empty deque. Occurs after draining all elements or before the first push.","commonSituations":"Deque as a sliding window fully consumed between frames; peek before first enqueue; consumer loop over-pops.","solutions":["Check `deque.is_empty?` before `peek_first` or `pop_first`.","Return nil explicitly when empty.","Rescue IndexError if empty front-access is expected control flow."],"exampleFix":"# before\nfront = deque.peek_first\n\n# after\nfront = deque.is_empty? ? nil : deque.peek_first","handlingStrategy":"validation","validationCode":"return nil if deque.is_empty?\ndeque.peek_first","typeGuard":"def deque_readable?(deque)\n  deque.respond_to?(:is_empty?) && deque.respond_to?(:peek_first) && !deque.is_empty?\nend","tryCatchPattern":"begin\n  deque.peek_first\nrescue IndexError\n  nil\nend","preventionTips":["Check is_empty? before peek_first or pop_first.","Note the asymmetry: overflow on push is silent, empty access raises.","Return nil explicitly when empty."],"tags":["ruby","deque","precondition","empty-state"],"backgroundTag":null,"analyzedSha":"69932aed1891a7b7f6a0de88cd116d3fe13e7032","analyzedAt":"2026-08-13T23:02:37.581Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}