Skip to content

Shift Method ​

The shift() method removes and returns the first item from the collection. The collection is modified in the process.

Basic Syntax ​

typescript
collect(items).shift()

Examples ​

Basic Usage ​

typescript
import { collect } from 'ts-collect'

// Array example
const numbers = collect([1, 2, 3, 4, 5])
const first = numbers.shift()

console.log(first) // 1
console.log(numbers.all()) // [2, 3, 4, 5]

// String array
const words = collect(['first', 'second', 'third'])
const firstWord = words.shift()

console.log(firstWord) // 'first'
console.log(words.all()) // ['second', 'third']

Working with Objects ​

typescript
interface Task {
  id: number
  title: string
  priority: number
}

const tasks = collect<Task>([
  { id: 1, title: 'First Task', priority: 1 },
  { id: 2, title: 'Second Task', priority: 2 },
  { id: 3, title: 'Third Task', priority: 3 }
])

const firstTask = tasks.shift()
console.log(firstTask) // { id: 1, title: 'First Task', priority: 1 }
console.log(tasks.all()) // [{ id: 2, ... }, { id: 3, ... }]

Real-world Examples ​

Queue Implementation ​

typescript
interface QueueItem {
  id: string
  type: string
  data: any
  createdAt: Date
}

class Queue {
  private items: Collection<QueueItem>

  constructor() {
    this.items = collect<QueueItem>([])
  }

  enqueue(item: Omit<QueueItem, 'createdAt'>) {
    this.items.push({
      ...item,
      createdAt: new Date()
    })
    return this
  }

  dequeue(): QueueItem | undefined {
    return this.items.shift()
  }

  peek(): QueueItem | undefined {
    return this.items.first()
  }

  isEmpty(): boolean {
    return this.items.isEmpty()
  }

  size(): number {
    return this.items.count()
  }
}

// Usage
const queue = new Queue()
queue.enqueue({
  id: '1',
  type: 'email',
  data: { to: 'user@example.com' }
})

Task Processor ​

typescript
interface ProcessingTask {
  id: string
  status: 'pending' | 'processing' | 'completed'
  payload: any
  attempts: number
  maxAttempts: number
}

class TaskProcessor {
  private tasks: Collection<ProcessingTask>

  constructor() {
    this.tasks = collect<ProcessingTask>([])
  }

  addTask(payload: any) {
    this.tasks.push({
      id: Date.now().toString(),
      status: 'pending',
      payload,
      attempts: 0,
      maxAttempts: 3
    })
  }

  async processNextTask() {
    const task = this.tasks.shift()
    if (!task)
      return null

    try {
      task.status = 'processing'
      task.attempts++

      // Process task...
      await this.processTask(task)

      task.status = 'completed'
      return task
    }
    catch (error) {
      if (task.attempts < task.maxAttempts) {
        // Re-add to queue for retry
        this.tasks.push(task)
      }
      throw error
    }
  }

  private async processTask(task: ProcessingTask) {
    // Implementation details...
  }
}

Advanced Usage ​

Buffer Management ​

typescript
interface DataBuffer<T> {
  data: T
  timestamp: number
  size: number
}

class CircularBuffer<T> {
  private buffer: Collection<DataBuffer<T>>
  private maxSize: number
  private currentSize: number

  constructor(maxSize: number) {
    this.buffer = collect<DataBuffer<T>>([])
    this.maxSize = maxSize
    this.currentSize = 0
  }

  write(data: T, size: number): boolean {
    while (this.currentSize + size > this.maxSize && !this.buffer.isEmpty()) {
      const removed = this.buffer.shift()
      if (removed) {
        this.currentSize -= removed.size
      }
    }

    if (size <= this.maxSize) {
      this.buffer.push({
        data,
        timestamp: Date.now(),
        size
      })
      this.currentSize += size
      return true
    }

    return false
  }

  read(): T | undefined {
    const item = this.buffer.shift()
    if (item) {
      this.currentSize -= item.size
      return item.data
    }
    return undefined
  }
}

Type Safety ​

typescript
interface TypedItem {
  id: number
  value: string
  optional?: boolean
}

const items = collect<TypedItem>([
  { id: 1, value: 'first' },
  { id: 2, value: 'second', optional: true }
])

// Type-safe shift operation
const item: TypedItem | undefined = items.shift()

// TypeScript knows about the types
if (item) {
  console.log(item.id) // ✓ Valid
  console.log(item.value) // ✓ Valid
  console.log(item.optional) // ✓ Valid (optional)
}

Return Value ​

  • Returns the first element from the collection and removes it
  • Returns undefined if the collection is empty
  • Modifies the original collection by removing the first element
  • Maintains type safety with TypeScript
  • Collection size is reduced by 1

Released under the MIT License.