1// 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;
23    window.setTimeout(() => {
24      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 {
33  let timerId: undefined|number;
34  return () => {
35    if (timerId) {
36      window.clearTimeout(timerId);
37    }
38    timerId = window.setTimeout(() => {
39      f();
40      timerId = undefined;
41    }, ms);
42  };
43}
44