export function purchaseIndex(totalItemsSold: number, numberOfCustomers: number): number { if (numberOfCustomers === 0) { throw new Error('Number of customers cannot be zero'); } return (totalItemsSold / numberOfCustomers) * 1000; } export function purchaseRate(productPurchases: number, totalTransactions: number): number; export function purchaseRate(productPurchases: number[], totalTransactions: number[]): number[]; export function purchaseRate(productPurchases: number | number[], totalTransactions: number | number[]): number | number[] { if (Array.isArray(productPurchases) && Array.isArray(totalTransactions)) { if (productPurchases.length !== totalTransactions.length) throw new Error('Arrays must have the same length'); return productPurchases.map((pp, i) => purchaseRate(pp, totalTransactions[i])); } if (typeof productPurchases === 'number' && typeof totalTransactions === 'number') { if (totalTransactions === 0) throw new Error('Total transactions cannot be zero'); return (productPurchases / totalTransactions) * 100; } throw new Error('Input types must match'); } export function liftValue(jointPurchaseRate: number, productAPurchaseRate: number, productBPurchaseRate: number): number; export function liftValue(jointPurchaseRate: number[], productAPurchaseRate: number[], productBPurchaseRate: number[]): number[]; export function liftValue(jointPurchaseRate: number | number[], productAPurchaseRate: number | number[], productBPurchaseRate: number | number[]): number | number[] { if (Array.isArray(jointPurchaseRate) && Array.isArray(productAPurchaseRate) && Array.isArray(productBPurchaseRate)) { if (jointPurchaseRate.length !== productAPurchaseRate.length || jointPurchaseRate.length !== productBPurchaseRate.length) throw new Error('Arrays must have the same length'); return jointPurchaseRate.map((jpr, i) => liftValue(jpr, productAPurchaseRate[i], productBPurchaseRate[i])); } if (typeof jointPurchaseRate === 'number' && typeof productAPurchaseRate === 'number' && typeof productBPurchaseRate === 'number') { const expectedJointRate = productAPurchaseRate * productBPurchaseRate; if (expectedJointRate === 0) throw new Error('Expected joint rate cannot be zero'); return jointPurchaseRate / expectedJointRate; } throw new Error('Input types must match'); } export function costRatio(cost: number, salePrice: number): number; export function costRatio(cost: number[], salePrice: number[]): number[]; export function costRatio(cost: number | number[], salePrice: number | number[]): number | number[] { if (Array.isArray(cost) && Array.isArray(salePrice)) { if (cost.length !== salePrice.length) throw new Error('Arrays must have the same length'); return cost.map((c, i) => costRatio(c, salePrice[i])); } if (typeof cost === 'number' && typeof salePrice === 'number') { if (salePrice === 0) throw new Error('Sale price cannot be zero'); return cost / salePrice; } throw new Error('Input types must match'); } export function grossMarginRate(salePrice: number, cost: number): number; export function grossMarginRate(salePrice: number[], cost: number[]): number[]; export function grossMarginRate(salePrice: number | number[], cost: number | number[]): number | number[] { if (Array.isArray(salePrice) && Array.isArray(cost)) { if (salePrice.length !== cost.length) throw new Error('Arrays must have the same length'); return salePrice.map((sp, i) => grossMarginRate(sp, cost[i])); } if (typeof salePrice === 'number' && typeof cost === 'number') { if (salePrice === 0) throw new Error('Sale price cannot be zero'); return (salePrice - cost) / salePrice; } throw new Error('Input types must match'); } export function averageSpendPerCustomer(totalRevenue: number, numberOfCustomers: number): number; export function averageSpendPerCustomer(totalRevenue: number[], numberOfCustomers: number[]): number[]; export function averageSpendPerCustomer(totalRevenue: number | number[], numberOfCustomers: number | number[]): number | number[] { if (Array.isArray(totalRevenue) && Array.isArray(numberOfCustomers)) { if (totalRevenue.length !== numberOfCustomers.length) throw new Error('Arrays must have the same length'); return totalRevenue.map((tr, i) => averageSpendPerCustomer(tr, numberOfCustomers[i])); } if (typeof totalRevenue === 'number' && typeof numberOfCustomers === 'number') { if (numberOfCustomers === 0) throw new Error('Number of customers cannot be zero'); return totalRevenue / numberOfCustomers; } throw new Error('Input types must match'); }