Lodash Utilities (with import)

Uses lodash-es for utility functions via ESM import

/#
## Lodash Utilities with Type Safety

Demonstrates using lodash-es with TJS runtime validation.
#/

import { groupBy, sortBy, uniqBy, debounce, chunk } from 'lodash-es'

// Group items by a key
function groupUsers(users: [{ name: '', dept: '' }], key: 'dept'): { [key: '']: [{ name: '', dept: '' }] } {
  return groupBy(users, key)
}

// Sort items by property
function sortByAge(users: [{ name: '', age: 0 }]): [{ name: '', age: 0 }] {
  return sortBy(users, ['age'])
}

// Remove duplicates by property
function uniqueByEmail(users: [{ email: '', name: '' }]): [{ email: '', name: '' }] {
  return uniqBy(users, 'email')
}

// Chunk array into smaller arrays
// Note: nested array types like [['']] aren't supported yet, so we omit return type
function paginate(items: [''], pageSize: 10) {
  return chunk(items, pageSize)
}

// Process data pipeline
function processUserData(input: {
  users: [{ id: 0, name: '', email: '', dept: '' }]
}): {
  byDept: { [key: '']: [{ id: 0, name: '', email: '', dept: '' }] },
  unique: [{ id: 0, name: '', email: '', dept: '' }],
  count: 0
} {
  const unique = uniqBy(input.users, 'email')
  const byDept = groupBy(unique, 'dept')

  return {
    byDept,
    unique: sortBy(unique, ['name']),
    count: unique.length
  }
}

test('groupUsers groups by department') {
  const users = [
    { name: 'Alice', dept: 'eng' },
    { name: 'Bob', dept: 'sales' },
    { name: 'Carol', dept: 'eng' }
  ]
  const grouped = groupUsers(users, 'dept')
  expect(grouped.eng.length).toBe(2)
  expect(grouped.sales.length).toBe(1)
}

test('sortByAge sorts correctly') {
  const users = [
    { name: 'Alice', age: 30 },
    { name: 'Bob', age: 25 },
    { name: 'Carol', age: 35 }
  ]
  const sorted = sortByAge(users)
  expect(sorted[0].name).toBe('Bob')
  expect(sorted[2].name).toBe('Carol')
}

test('uniqueByEmail deduplicates') {
  const users = [
    { email: 'a@b.com', name: 'Alice' },
    { email: 'a@b.com', name: 'Alice2' },
    { email: 'c@d.com', name: 'Carol' }
  ]
  const unique = uniqueByEmail(users)
  expect(unique.length).toBe(2)
}

test('paginate chunks correctly') {
  const items = ['a', 'b', 'c', 'd', 'e']
  const pages = paginate(items, 2)
  expect(pages.length).toBe(3)
  expect(pages[0]).toEqual(['a', 'b'])
  expect(pages[2]).toEqual(['e'])
}

// Run example
const users = [
  { id: 1, name: 'Alice', email: 'alice@co.com', dept: 'Engineering' },
  { id: 2, name: 'Bob', email: 'bob@co.com', dept: 'Sales' },
  { id: 3, name: 'Carol', email: 'carol@co.com', dept: 'Engineering' },
  { id: 4, name: 'Dave', email: 'alice@co.com', dept: 'Marketing' }, // dupe email
]

const result = processUserData({ users })
console.log('Unique users:', result.count)
console.log('Departments:', Object.keys(result.byDept))
console.log('Engineering team:', result.byDept['Engineering']?.map(u => u.name))