export type DerivedStored<T> = {
  id: string
  createdAtMs: number
  createdAt: string
  record: T
}

export function deriveStored<T>(
  value: T,
  now: () => string,
  makeId: () => string,
): DerivedStored<T> {
  const createdAtMs = Date.parse(now())
  if (Number.isNaN(createdAtMs)) {
    throw new RangeError('deriveStored: injected now() returned an unparseable timestamp')
  }

  return {
    id: makeId(),
    createdAtMs,
    createdAt: new Date(createdAtMs).toISOString(),
    record: JSON.parse(JSON.stringify(value)) as T,
  }
}
