1/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17export type OnProgressUpdateType = (percentage: number) => void;
18
19export class FunctionUtils {
20  static readonly DO_NOTHING = () => {
21    // do nothing
22  };
23
24  static readonly DO_NOTHING_ASYNC = (): Promise<void> => {
25    return Promise.resolve();
26  };
27
28  static mixin<T extends object, U extends object>(a: T, b: U): T & U {
29    const ret = {};
30    Object.assign(ret, a);
31    Object.assign(ret, b);
32
33    const assignMethods = (dst: object, src: object) => {
34      for (const methodName of Object.getOwnPropertyNames(
35        Object.getPrototypeOf(src),
36      )) {
37        const method = (src as any)[methodName];
38        (dst as any)[methodName] = method;
39      }
40    };
41
42    assignMethods(ret, a);
43    assignMethods(ret, b);
44
45    return ret as T & U;
46  }
47}
48