Skip to content

Commit

Permalink
fix: correct accum typings for parsers+reducers
Browse files Browse the repository at this point in the history
  • Loading branch information
trevor-anderson committed Mar 24, 2024
1 parent a499038 commit 3e744da
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
*/
export interface ItemDataParser<TItem extends DataParserItem, TAccum extends DataParserAccum> {
initialDataAccum: TAccum;
dataAccumUpdater: DataParserAccumUpdater<TItem>;
dataAccumUpdater: DataParserAccumUpdater<TItem, TAccum>;
}

export interface DataParserItem {
[K: PropertyKey]: any;
}

export interface DataParserAccum<DataParserAccumValue = any> {
[K: string]: DataParserAccumValue;
export interface DataParserAccum {
[K: string]: any;
}

/**
Expand All @@ -22,7 +22,7 @@ export interface DataParserAccum<DataParserAccumValue = any> {
* The generic _type_ parameter, `TItem`, specifies the type of the array items used
* in the 2nd and 4th parameters of `Array.prototype.reduce`.
*/
export type DataParserAccumUpdater<TItem extends DataParserItem> = <TAccum extends DataParserAccum>(
export type DataParserAccumUpdater<TItem extends DataParserItem, TAccum extends DataParserAccum> = (
accum: TAccum,
item: TItem,
index: number,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,10 @@ export class ItemsPerMonthDataParser
// STATIC MEMBERS:
static monthStartTimestamps: MonthStartTimestamps;
static initialDataAccum: ItemsPerMonthDataParserAccum;
static dataAccumUpdater: DataParserAccumUpdater<ItemsPerMonthDataParserItem>;
static dataAccumUpdater: DataParserAccumUpdater<
ItemsPerMonthDataParserItem,
ItemsPerMonthDataParserAccum
>;

/**
* Returns an integer timestamp equal to the first millisecond of the month of the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,19 @@ export interface ItemsPerStatusDataParserAccum<TItem extends ItemsPerStatusDataP
}

/**
* This `ItemDataParser` implementation is used to count the number of items
* per item-status.
* This `ItemDataParser` implementation is used to count the number of items per item-status.
*/
export class ItemsPerStatusDataParser<TItem extends ItemsPerStatusDataParserItem>
implements ItemDataParser<TItem, ItemsPerStatusDataParserAccum<TItem>>
{
initialDataAccum: ItemsPerStatusDataParserAccum<TItem>;
dataAccumUpdater: DataParserAccumUpdater<TItem>;
dataAccumUpdater: DataParserAccumUpdater<TItem, ItemsPerStatusDataParserAccum<TItem>>;

constructor(itemStatuses: ReadonlyArray<TItem["status"]>) {
this.initialDataAccum = {
STATUS_COUNTS: itemStatuses.reduce(
(acc, status) => ({ ...acc, [status]: 0 }),
{} as ItemsPerStatusDataParserAccum<TItem>["STATUS_COUNTS"]
{} as Record<TItem["status"], number>
),
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export class ItemsStatisticsDataParser<TItem extends DataParserItem>

// Instance initialDataAccum is a reference to the static initialDataAccum
initialDataAccum = ItemsStatisticsDataParser.initialDataAccum;
dataAccumUpdater: DataParserAccumUpdater<TItem>;
dataAccumUpdater: DataParserAccumUpdater<TItem, ItemsStatisticsDataParserAccum>;

constructor(getItemStat: GetItemStatFn<TItem>) {
this.initialDataAccum = { ...ItemsStatisticsDataParser.initialDataAccum };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export class UpcomingEventsDataParser<TItem extends DataParserItem>
private static now = dayjs();

initialDataAccum: UpcomingEventsDataParserAccum<TItem>;
dataAccumUpdater: DataParserAccumUpdater<TItem>;
dataAccumUpdater: DataParserAccumUpdater<TItem, UpcomingEventsDataParserAccum<TItem>>;

constructor(
getItemEvents: GetItemEventsFn<TItem>,
Expand Down
11 changes: 7 additions & 4 deletions src/pages/Dashboard/DashboardDataContext/ItemsDataReducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import type { ItemDataParser, DataParserItem, DataParserAccum } from "./ItemData
*/
export class ItemsDataReducer<
TItem extends DataParserItem,
TDataParsers extends Array<ItemDataParser<TItem, DataParserAccum>>
TDataParsers extends Array<ItemDataParser<TItem, any>>,
> {
// INSTANCE MEMBERS
readonly initialDataAccum: CombinedReducerAccum<TItem, TDataParsers>;
Expand All @@ -34,7 +34,7 @@ export class ItemsDataReducer<
// Update combinedInitialDataAccum
combinedInitialDataAccum: {
...accum.combinedInitialDataAccum,
...itemDataParser.initialDataAccum,
...(itemDataParser.initialDataAccum as Record<string, unknown>),
},
// Update arrayOfDataAccumUpdaterFns
arrayOfDataAccumUpdaterFns: [
Expand All @@ -53,7 +53,10 @@ export class ItemsDataReducer<
return arrayOfItems.reduce((itemsDataAccum, item, index, itemsArray) => {
// For each item, each accum-updater function is called
arrayOfDataAccumUpdaterFns.forEach((dataAccumUpdater) => {
itemsDataAccum = dataAccumUpdater(itemsDataAccum, item, index, itemsArray);
// prettier-ignore
itemsDataAccum = dataAccumUpdater(
itemsDataAccum, item, index, itemsArray
) as CombinedReducerAccum<TItem, TDataParsers>;
});
return itemsDataAccum;
}, structuredClone(this.initialDataAccum));
Expand All @@ -63,5 +66,5 @@ export class ItemsDataReducer<

type CombinedReducerAccum<
TItem extends DataParserItem,
TDataParsers extends Array<ItemDataParser<TItem, DataParserAccum>>
TDataParsers extends Array<ItemDataParser<TItem, DataParserAccum>>,
> = Simplify<UnionToIntersection<TDataParsers[number]["initialDataAccum"]>>;

0 comments on commit 3e744da

Please sign in to comment.