code: def take(n)
        raise ArgumentError, 'n must be an integer' unless n.is_a? Integer
  
        # Optimize for the most simple cases
        return [self] if n == 1 || n == -1
        return [] if n.zero?
  
        n_abs = n.abs
  
        res = Array.new n_abs
  
        if n.positive?
          res[0] = self
          enum = after
          iter = 1.upto(n_abs - 1)
        else
          res[n_abs - 1] = self
          enum = before
          iter = (n_abs - 2).downto 0
        end
  
        iter.each { |i| res[i] = enum.next }
        res
      rescue StopIteration
        res.compact!
        res
      end
docs: rubocop:disable Metrics/AbcSize
   rubocop:disable Metrics/CyclomaticComplexity
   rubocop:disable Metrics/MethodLength
   rubocop:disable Metrics/PerceivedComplexity
   Take n items and put them into a sorted array. If n is positive the array
   will include this item, as well the n - 1 items following it in the chain.
   If n is negative the items will be taken from before this item instead.
  
   If there are less than n - 1 items before/after this the resulting array
   will contain less than n items.
  
   @raise  [ArgumentError] if `n` is not an integer.
  
   @param  n [Integer] the number of items to take.
   @return [Array<Listable>] an array containing the taken items.