UNPKG

material-motion

Version:

Makes it easy to add rich, interactive motion to your application.

61 lines (53 loc) 1.84 kB
/** @license * Copyright 2016 - present The Material Motion Authors. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ import { Constructor, MotionNextOperable, NextChannel, Observable, ObservableWithMotionOperators, Observer, } from '../../types'; export type _SlidingWindowArgs = { size: number, }; export interface MotionWindowable<T> { _slidingWindow(kwargs?: _SlidingWindowArgs): ObservableWithMotionOperators<Array<T>>; } export function withSlidingWindow<T, S extends Constructor<MotionNextOperable<T>>>(superclass: S): S & Constructor<MotionWindowable<T>> { return class extends superclass implements MotionWindowable<T> { /** * Emits the last values to be received in an array of the given `size`. * * Reuses the same array on each emit, so if you want to compare emissions, * make a copy of each as you receive it. */ _slidingWindow({ size = 2 } = {}): ObservableWithMotionOperators<Array<T>> { return this._nextOperator({ operation({ emit }) { const result: Array<T> = []; return ({ upstream }) => { result.push(upstream); if (result.length > size) { result.shift(); } emit(result); }; } }); } }; }