Skip to content

Times Method

The times() method creates a new collection by invoking the callback a given number of times. It's useful for generating sequences or performing an action a specific number of times.

Basic Syntax

typescript
collect().times<U>(count: number, callback: (index: number) => U)

Examples

Basic Usage

typescript
import { collect } from 'ts-collect'

// Generate sequence of numbers
const numbers = collect().times(5, n => n + 1)
console.log(numbers.all()) // [1, 2, 3, 4, 5]

// Generate sequence of objects
const items = collect().times(3, i => ({
  id: i,
  name: `Item ${i}`
}))
console.log(items.all())
// [
//   { id: 0, name: 'Item 0' },
//   { id: 1, name: 'Item 1' },
//   { id: 2, name: 'Item 2' }
// ]

Working with Complex Types

typescript
interface User {
  id: number
  username: string
  email: string
}

// Generate test users
const users = collect().times<User>(3, i => ({
  id: i + 1,
  username: `user${i + 1}`,
  email: `user${i + 1}@example.com`
}))

console.log(users.all())
// [
//   { id: 1, username: 'user1', email: 'user1@example.com' },
//   { id: 2, username: 'user2', email: 'user2@example.com' },
//   { id: 3, username: 'user3', email: 'user3@example.com' }
// ]

Real-world Examples

Test Data Generator

typescript
interface TestRecord {
  id: string
  timestamp: Date
  value: number
  metadata: Record<string, any>
}

class TestDataGenerator {
  generateTimeSeriesData(count: number): Collection<TestRecord> {
    const baseTime = new Date()

    return collect().times<TestRecord>(count, i => ({
      id: `record-${i}`,
      timestamp: new Date(baseTime.getTime() + i * 3600000), // Hour intervals
      value: Math.round(Math.random() * 100),
      metadata: {
        sequence: i,
        type: i % 2 === 0 ? 'even' : 'odd'
      }
    }))
  }

  generateLoadTestData(count: number): Collection<TestRecord> {
    return collect().times<TestRecord>(count, i => ({
      id: `load-${i}`,
      timestamp: new Date(),
      value: Math.floor(Math.random() * 1000),
      metadata: {
        cpu: Math.random() * 100,
        memory: Math.random() * 100
      }
    }))
  }
}

Pagination Generator

typescript
interface PageInfo {
  pageNumber: number
  offset: number
  limit: number
  isActive: boolean
}

class PaginationBuilder {
  constructor(private totalItems: number, private itemsPerPage: number) {}

  generatePages(): Collection<PageInfo> {
    const totalPages = Math.ceil(this.totalItems / this.itemsPerPage)
    const currentPage = 1

    return collect().times<PageInfo>(totalPages, i => ({
      pageNumber: i + 1,
      offset: i * this.itemsPerPage,
      limit: this.itemsPerPage,
      isActive: i + 1 === currentPage
    }))
  }
}

// Usage
const pagination = new PaginationBuilder(100, 10)
const pages = pagination.generatePages()

Advanced Usage

Mock API Response Generator

typescript
interface ApiResponse<T> {
  id: string
  timestamp: Date
  data: T
  status: 'success' | 'error'
  metadata: {
    requestId: string
    processingTime: number
  }
}

class MockApiGenerator {
  generateResponses<T>(
    count: number,
    dataGenerator: (index: number) => T
  ): Collection<ApiResponse<T>> {
    return collect().times<ApiResponse<T>>(count, i => ({
      id: `response-${i}`,
      timestamp: new Date(),
      data: dataGenerator(i),
      status: Math.random() > 0.1 ? 'success' : 'error',
      metadata: {
        requestId: `req-${Date.now()}-${i}`,
        processingTime: Math.random() * 1000
      }
    }))
  }
}

// Usage
const generator = new MockApiGenerator()
const responses = generator.generateResponses(5, i => ({
  userId: i,
  action: 'login'
}))

Matrix Generator

typescript
type Matrix = number[][]

class MatrixGenerator {
  generateMatrix(size: number): Collection<number[]> {
    return collect().times<number[]>(size, i =>
      collect().times<number>(size, j =>
        i * size + j).all())
  }

  generateIdentityMatrix(size: number): Collection<number[]> {
    return collect().times<number[]>(size, i =>
      collect().times<number>(size, j =>
        i === j ? 1 : 0).all())
  }
}

Type Safety

typescript
interface TypedItem {
  id: number
  value: string
  metadata?: Record<string, any>
}

// Type-safe generation
const items = collect().times<TypedItem>(3, i => ({
  id: i,
  value: `value-${i}`,
  metadata: { index: i }
}))

// TypeScript ensures correct types
items.each((item) => {
  console.log(item.id) // ✓ Valid
  console.log(item.value) // ✓ Valid
  console.log(item.metadata) // ✓ Valid (optional)
})

// Compile-time type checking
const numbers = collect().times<number>(5, i => i * 2)
const strings = collect().times<string>(3, i => `item-${i}`)

Return Value

  • Returns a new Collection containing the generated items
  • Number of items matches the specified count
  • Each item is generated using the callback function
  • Callback receives current index (0-based)
  • Maintains type safety with TypeScript through generics
  • Can be chained with other collection methods

Released under the MIT License.