(
getDeps: (depArgs?: TDepArgs) => [...TDeps],
fn: (...args: NoInfer<[...TDeps]>) => TResult,
opts: {
key: any
debug?: () => any
onChange?: (result: TResult) => void
},
)
| 134 | } |
| 135 | |
| 136 | export function memo<TDeps extends readonly any[], TDepArgs, TResult>( |
| 137 | getDeps: (depArgs?: TDepArgs) => [...TDeps], |
| 138 | fn: (...args: NoInfer<[...TDeps]>) => TResult, |
| 139 | opts: { |
| 140 | key: any |
| 141 | debug?: () => any |
| 142 | onChange?: (result: TResult) => void |
| 143 | }, |
| 144 | ): (depArgs?: TDepArgs) => TResult { |
| 145 | let deps: any[] = [] |
| 146 | let result: TResult | undefined |
| 147 | |
| 148 | return (depArgs) => { |
| 149 | let depTime: number |
| 150 | if (opts.key && opts.debug) depTime = Date.now() |
| 151 | |
| 152 | const newDeps = getDeps(depArgs) |
| 153 | |
| 154 | const depsChanged = |
| 155 | newDeps.length !== deps.length || |
| 156 | newDeps.some((dep: any, index: number) => deps[index] !== dep) |
| 157 | |
| 158 | if (!depsChanged) { |
| 159 | return result! |
| 160 | } |
| 161 | |
| 162 | deps = newDeps |
| 163 | |
| 164 | let resultTime: number |
| 165 | if (opts.key && opts.debug) resultTime = Date.now() |
| 166 | |
| 167 | result = fn(...newDeps) |
| 168 | opts?.onChange?.(result) |
| 169 | |
| 170 | if (opts.key && opts.debug) { |
| 171 | if (opts?.debug()) { |
| 172 | const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100 |
| 173 | const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100 |
| 174 | const resultFpsPercentage = resultEndTime / 16 |
| 175 | |
| 176 | const pad = (str: number | string, num: number) => { |
| 177 | str = String(str) |
| 178 | while (str.length < num) { |
| 179 | str = ' ' + str |
| 180 | } |
| 181 | return str |
| 182 | } |
| 183 | |
| 184 | console.info( |
| 185 | `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`, |
| 186 | ` |
| 187 | font-size: .6rem; |
| 188 | font-weight: bold; |
| 189 | color: hsl(${Math.max( |
| 190 | 0, |
| 191 | Math.min(120 - 120 * resultFpsPercentage, 120), |
| 192 | )}deg 100% 31%);`, |
| 193 | opts?.key, |
no test coverage detected