0.5.3 • Published 7 years ago

soboku v0.5.3

Weekly downloads
4
License
MIT
Repository
github
Last release
7 years ago

Build Status codecov gzip size

soboku

A tiny javascript package for reactive programming. Reduce global mutable flags and if-else statement from your code.

How to use

Node.js

npm install soboku

Browser

<script src="https://unpkg.com/soboku/dist/soboku.min.js"></script>
<script>
    // soboku in global
    const { state } = soboku;
</script>

Example

import { state, editer, combine } from "soboku"

const first = state(""),
      last = state(""),
      full = editer((f: string, l: string) => `${f} ${l}`.trim(), [first, last]),
      name = combine({ first, last, full });

full.report(console.log);
name.report(console.log);

console.log(name.s()) // { first: "", last: "", full: "" }

first.next("Napoléon");
// Napoléon
// { first: "Napoléon", last: "", full: "Napoléon" }

last.next("Bonaparte");
// Napoléon Bonaparte
// { first: "Napoléon", last: "Bonaparte", full: "Napoléon Bonaparte" }

Libraries

API

Reporter

reporter<T>(): Reporter<T>

import { reporter } from "soboku"

const message = reporter<string>();
message.report(console.log);
message.next("Hello soboku");

// console
// Hello soboku

listener<T>(func: Listener<T>, thisArg?: any): IListener<T>

gate<T> gate<T>(gatekeeper: IStateHolder<boolean>, reporter: IReporter<T>): IReporter<T>

import { gate, reporter, state } from "soboku"

const done = state(false);
const _message = reporter<string>();
const message = gate(done, _message);
message.report(console.log);

_message.next("Hello");
done.next(true);
_message.next("Bye");

// console
// Bye

State

state<T>(initial: T): State<T>

import { state } from "soboku"

const count = state(0);
console.log(count.s()); // 0

count.report(console.log);
count.next(100);
// console
// 100

console.log(count.s()) // 100

sarray<T>(initial?: T[]): ISArray<T>

import { sarray } from "soboku"

const nums = sarray([1, 2, 3]);
console.log(nums.s()) // [1, 2, 3]

nums.report(console.log);

nums.push(4);
// console
// [1, 2, 3, 4]

toStateHolder<T>(atom: Atom<T>): IStateHolder<T>

import { toStateHolder } from "soboku"

const num = toStateHolder(100);
console.log(num.s()) // 100

editer<T>(func: (...atoms: Atom<any>[]) => T, atoms: Atom<any>[]): Calc<T>

import { state, editer } from "soboku"

function twice(num: number): number {
    return num * 2;
}

function add(num1: number, num2: number): number {
    return num1 + num2;
}

const x = state(10);
const y = editer(twice, [x]);
const z = editer(add, [x, y]);
console.log(z.s()) // 30

z.report(console.log);

x.next(52);
// console
// 156

combine<T>(sobokuObj: { [K in keyof T]: Atom<T[K]> }): Calc<T>

import { state, combine } from "soboku"

const x = state(10);
const y = state(2);
const point = combine({ x, y, z: 20 });
console.log(point.s()) // { x: 10, y: 2, z: 20 }

point.report(console.log);

y.next(100);
// console
// { x: 10, y: 100, z: 20 }

publisher(permition: IReporter<boolean>, reporter: Calc<T>): Calc<T>

import { state, publisher } from "soboku"

const complete = state(false);
const source = state(10);
const num = publisher(complete, source);
console.log(num.s()) // 10

num.report(console.log);

source.next(100);
source.next(20);
complete.next(true); // permition turns true then report num
// 20
source.next(2);
// 2

trigger(conditon: Calc<boolean>): Calc<boolean>

import { state, trigger } from "soboku"

const complete = state(false);
const isDone = trigger(complete);
console.log(isDone.s()) // false

isDone.report(console.log);

count.next(false);
count.next(false);
count.next(true);
// console
// true

ntrigger(conditon: Calc<boolean>): Calc<boolean>

import { state, ntrigger } from "soboku"

const complete = state(false);
const isDone = ntrigger(complete);
console.log(isDone.s()) // true

isDone.report(console.log);

count.next(true);
count.next(true);
count.next(false);
// console
// true

Class

ReporterClass<T> implements IReporter<T>, IProgressable<T>

Types

Atom<T>

T | StateHolder\

Calc<T>

IReporter\ & IStateHolder\

Listener<T>

(val: T) => void;

Reporter<T>

IReporter\ & IProgressable\

State<T>

IReporter\ & IProgressabel\ & IStateHolder\

Interfaces

IListener<T>

  • read(val: T) => void

IProgressable<T>

  • next(val: T): T

IReporter<T>

  • report(listener: Listener\ | IListener\): Unsubscriber
  • listenerCount(): number

IUnsubscriber

  • unsubscribe: () => void

IStateHolder<T>

  • s(): T

ISArray<T> extends IReporter<T[]> implements IStateHolder<T>

  • s(): T[];
  • pop(): T | undefined;
  • push(...items: T[]): number;
  • reverse(): T[];
  • shift(): T | undefined;
  • sort(compareFn?: (a: T, b: T) => number): T[];
  • splice(start: number, deleteCount?: number): T[];
  • splice(start: number, deleteCount: number, ...items: T[]): T[];
  • unshift(...items: T[]): number;

ISObservable<I, O, T extends Reporter<I>>

  • readonly input: T
  • readonly error: IReporter\
  • readonly output: IReporter\
  • readonly reset: IReporter\

LICENSE

MIT

0.5.3

7 years ago

0.5.2

7 years ago

0.5.1

7 years ago

0.5.0

7 years ago

0.4.9

7 years ago

0.4.8

7 years ago

0.4.7

7 years ago

0.4.6

7 years ago

0.4.5

7 years ago

0.4.4

7 years ago

0.4.3

7 years ago

0.4.2

7 years ago

0.4.1

7 years ago

0.4.0

7 years ago

0.3.4

7 years ago

0.3.3

7 years ago

0.3.2

7 years ago

0.3.1

7 years ago

0.3.0

7 years ago

0.2.0

7 years ago

0.1.4

7 years ago

0.1.3

7 years ago

0.1.2

7 years ago

0.1.1

7 years ago

0.1.0

7 years ago