blob: babf3f4970e4874f112547ca811bff0dc6c52f49 [file] [log] [blame]
Hector Dearmanda988af2020-02-25 13:42:42 +00001// Copyright (C) 2020 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Returns a wrapper around |f| which calls f at most once every |ms|ms.
16export function ratelimit(f: Function, ms: number): Function {
17 let inProgess = false;
18 return () => {
19 if (inProgess) {
20 return;
21 }
22 inProgess = true;
Hector Dearman7d94c452023-03-27 15:16:57 +010023 setTimeout(() => {
Hector Dearmanda988af2020-02-25 13:42:42 +000024 f();
25 inProgess = false;
26 }, ms);
27 };
28}
29
30// Returns a wrapper around |f| which waits for a |ms|ms pause in calls
31// before calling |f|.
32export function debounce(f: Function, ms: number): Function {
Hector Dearman7d94c452023-03-27 15:16:57 +010033 let timerId: undefined|ReturnType<typeof setTimeout>;
Hector Dearmanda988af2020-02-25 13:42:42 +000034 return () => {
35 if (timerId) {
Hector Dearman7d94c452023-03-27 15:16:57 +010036 clearTimeout(timerId);
Hector Dearmanda988af2020-02-25 13:42:42 +000037 }
Hector Dearman7d94c452023-03-27 15:16:57 +010038 timerId = setTimeout(() => {
Hector Dearmanda988af2020-02-25 13:42:42 +000039 f();
40 timerId = undefined;
41 }, ms);
42 };
43}