Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions packages/misc/default-number-value/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# @x-oasis/default-number-value

## Installation

```bash
$ npm i @x-oasis/default-number-value
```

## How to use

```typescript
import booleanWithDefault from '@x-oasis/default-number-value'
```

## How to run test

```bash
$ pnpm test
```
27 changes: 27 additions & 0 deletions packages/misc/default-number-value/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"name": "@x-oasis/default-number-value",
"version": "0.1.8",
"description": "default-number-value function",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"module": "dist/default-number-value.esm.js",
"files": [
"dist",
"index.ts",
"src"
],
"scripts": {
"build": "tsdx build --tsconfig tsconfig.build.json",
"clean": "rimraf ./dist",
"test": "vitest",
"compile": "tsc -p tsconfig.build.json"
},
"author": "",
"license": "ISC",
"devDependencies": {
"tsdx": "^0.14.1"
},
"dependencies": {
"@x-oasis/default-value": "workspace:*"
}
}
10 changes: 10 additions & 0 deletions packages/misc/default-number-value/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import defaultValue from '@x-oasis/default-value';

function defaultNumberValue(value, _defaultValue) {
const _value = defaultValue(value, _defaultValue);
const _n = Number(_value);
if (typeof _n !== 'number') return 0;
return _n;
}

export default defaultNumberValue;
10 changes: 10 additions & 0 deletions packages/misc/default-number-value/test/test.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { expect, test } from 'vitest';
import defaultNumberValue from '../src';

test('boolean with default', async () => {
expect(defaultNumberValue(undefined, 1)).toBe(1);
expect(defaultNumberValue(NaN, 1)).toBe(1);
expect(defaultNumberValue(null, 1)).toBe(1);
expect(defaultNumberValue(3, 4)).toBe(3);
expect(defaultNumberValue(0, 4)).toBe(0);
});
12 changes: 12 additions & 0 deletions packages/misc/default-number-value/tsconfig.build.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"extends": "../../../tsconfig.build.json",
"compilerOptions": {
"outDir": "./dist",
"esModuleInterop": true
},

"include": [
"index.ts",
"src/**/*"
]
}
7 changes: 7 additions & 0 deletions packages/misc/default-number-value/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"jsx": "react",
"esModuleInterop": true
}
}
26 changes: 26 additions & 0 deletions packages/misc/default-number-value/vitest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// import path from 'path';
// import tsPath from 'vite-tsconfig-paths';
import { defineConfig } from 'vitest/config';

// const __dirname = import.meta.url.slice(7, import.meta.url.lastIndexOf('/'));

export default defineConfig({
test: {
globals: true,
include: ['test/**/*.(spec|test).ts'],
exclude: ['node_modules/**'],
threads: false,

coverage: {
provider: 'istanbul', // or 'c8'
},
},

// plugins: [tsPath()],
resolve: {
alias: {},
},
define: {
__DEV__: false,
},
});
33 changes: 33 additions & 0 deletions packages/schedule/debounce/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# @x-oasis/debounce

## Installation

```bash
$ npm i @x-oasis/debounce
```

## How to use

```typescript
import debounce from '@x-oasis/debounce'
```

## How to run test

```bash
$ pnpm test
```

- resize: only care the final value
- keypress on autocomplete form with Ajax request

The main difference between this and debouncing is that debounce guarantees the execution of the function regularly, at least every X milliseconds.



## Further Reading

- [lodash - debounce](https://lodash.com/docs/4.17.15#debounce)
- [Debouncing and Throttling Explained Through Examples](https://css-tricks.com/debouncing-throttling-explained-examples/)
- [Debouncing Javascript Methods](http://unscriptable.com/2009/03/20/debouncing-javascript-methods/)
- [Difference Between throttling and debouncing a function](https://stackoverflow.com/questions/25991367/difference-between-throttling-and-debouncing-a-function)
23 changes: 23 additions & 0 deletions packages/schedule/debounce/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "@x-oasis/debounce",
"version": "0.1.8",
"description": "debounce function",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"module": "dist/debounce.esm.js",
"scripts": {
"build": "tsdx build --tsconfig tsconfig.build.json",
"clean": "rimraf ./dist",
"test": "vitest",
"compile": "tsc -p tsconfig.build.json"
},
"author": "",
"license": "ISC",
"dependencies": {
"@x-oasis/default-boolean-value": "workspace:*",
"@x-oasis/default-number-value": "workspace:*"
},
"devDependencies": {
"tsdx": "^0.14.1"
}
}
67 changes: 67 additions & 0 deletions packages/schedule/debounce/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { Options } from './types';
import defaultBooleanValue from '@x-oasis/default-boolean-value';
import defaultNumberValue from '@x-oasis/default-number-value';

const DEFAULT_TIMEOUT = 200;

/**
*
* @param func
* @param timeout
* @returns
*
* trigger first, then trigger on the last
*/

export default function debounce(
func: Function,
timeout = DEFAULT_TIMEOUT,
options: Options
) {
let lastPerformTime = 0;
let lastCallTime = 0;
const leading = defaultBooleanValue(options?.leading, false);
const trailing = defaultBooleanValue(options?.trailing, true);
const maxTime = defaultNumberValue(options?.maxTime, 0);
const resetTime = defaultNumberValue(options?.resetTime, 0);
let timeoutId = undefined;
let lastArgs = undefined;
let result = undefined;
let lastThis = undefined;

function clock() {}

function shouldPerform(time) {
if (!lastPerformTime) return true;
if (Date.now() - time > timeout) return true;
return false;
}

function perform() {
result = func.apply(lastThis, lastArgs);
lastPerformTime = Date.now();
timeoutId = undefined;
lastArgs = undefined;
}

function maxTimeoutHandler() {}

function performLeading() {
if (leading) perform();
}

function performTrailing() {}

return function (...args) {
const now = Date.now();
lastCallTime = now;
lastArgs = args;
lastThis = this; // eslint-disable-line

if (shouldPerform(now)) {
if (!timeoutId) {
performLeading();
}
}
};
}
9 changes: 9 additions & 0 deletions packages/schedule/debounce/src/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
type ResolveArgs = (...args: [any]) => any;

export type Options = {
leading: boolean;
trailing: boolean;
maxTime: number;
resetTime: number;
resolveArgs: ResolveArgs;
};
5 changes: 5 additions & 0 deletions packages/schedule/debounce/test/test.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { expect, test } from 'vitest';

test('vitest', async () => {
expect('vitest').toBe('vitest');
});
11 changes: 11 additions & 0 deletions packages/schedule/debounce/tsconfig.build.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"extends": "../../../tsconfig.build.json",
"compilerOptions": {
"outDir": "./dist",
"esModuleInterop": true
},

"include": [
"src/**/*"
]
}
7 changes: 7 additions & 0 deletions packages/schedule/debounce/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"jsx": "react",
"esModuleInterop": true
}
}
26 changes: 26 additions & 0 deletions packages/schedule/debounce/vitest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// import path from 'path';
// import tsPath from 'vite-tsconfig-paths';
import { defineConfig } from 'vitest/config';

// const __dirname = import.meta.url.slice(7, import.meta.url.lastIndexOf('/'));

export default defineConfig({
test: {
globals: true,
include: ['test/**/*.(spec|test).ts'],
exclude: ['node_modules/**'],
threads: false,

coverage: {
provider: 'istanbul', // or 'c8'
},
},

// plugins: [tsPath()],
resolve: {
alias: {},
},
define: {
__DEV__: false,
},
});
39 changes: 9 additions & 30 deletions packages/schedule/throttle/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,45 +17,24 @@ export default function throttle(
| boolean
) {
let last = 0;
let timeoutHandler = null;
const fallback = !!fallbackOptions;

let queue = [];
let _args = [];

return function throttled(...args: any[]) {
const now = Date.now();

if (now - last > threshold) {
last = now;
if (timeoutHandler) {
clearTimeout(timeoutHandler);
timeoutHandler = null;
queue = [];
}

fn.apply(null, args);
return;
}

if (!fallback) return;

timeoutHandler = setTimeout(() => {
const len = queue.length;
if (len) {
const currentArgs = queue[len - 1];
queue = [];
fn.apply(null, currentArgs);
}
}, threshold);

let nextArgs = args;
const persistArgs =
typeof fallbackOptions === 'object' ? fallbackOptions.persistArgs : null;

_args = args;

if (typeof persistArgs === 'function') {
nextArgs = persistArgs(args);
_args = persistArgs(args);
}

queue.push(nextArgs);
if (now - last > threshold) {
last = now;

return fn.apply(this, args);
}
};
}
2 changes: 1 addition & 1 deletion packages/struct/heap/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class Heap<T extends HeapBasicItem = HeapBasicItem> {
private _size: number;
private _comparator: Comparator;

constructor(items: Array<T>, comparator: Comparator) {
constructor(items: Array<T>, comparator?: Comparator) {
this._items = items || [];
this._size = this._items.length;
this._comparator = comparator || defaultComparator;
Expand Down
Loading