Mirror: 🎩 A tiny but capable push & pull stream library for TypeScript and Flow

Restructure and vendor bs-rebel for dune build

+1
.gitignore
···
node_modules/
lib/
src/**/*.js
__tests__/**/*.js
coverage/
_esy/
···
node_modules/
lib/
src/**/*.js
+
include/**/*.js
__tests__/**/*.js
coverage/
_esy/
+15 -5
bsconfig.json
···
{
"name": "wonka",
"version": "0.1.0",
"bsc-flags": ["-bs-super-errors", "-bs-no-version-header"],
"refmt": 3,
···
]
},
{
"dir": "__tests__",
"type": "dev"
}
],
-
"bs-dependencies" : [
-
"bs-rebel"
-
],
"bs-dev-dependencies": [
"@glennsl/bs-jest"
-
],
-
"namespace": false
}
···
{
"name": "wonka",
+
"namespace": true,
"version": "0.1.0",
"bsc-flags": ["-bs-super-errors", "-bs-no-version-header"],
"refmt": 3,
···
]
},
{
+
"dir": "include",
+
"subdirs": [
+
{
+
"dir": "rebel_native"
+
},
+
{
+
"dir": "rebel_js",
+
"backend": ["js"]
+
}
+
]
+
},
+
{
"dir": "__tests__",
"type": "dev"
}
],
+
"bs-dependencies" : [],
"bs-dev-dependencies": [
"@glennsl/bs-jest"
+
]
}
+9
include/rebel.ml
···
···
+
#if BS_NATIVE then
+
#if BSB_BACKEND = "js" then
+
include Rebel_js
+
#else
+
include Rebel_native
+
#end
+
#else
+
include Rebel_js
+
#end
+97
include/rebel_js/Array_js.re
···
···
+
type t('a) = array('a);
+
+
[@bs.new] external makeEmpty: unit => t('a) = "Array";
+
[@bs.new] external makeUninitialized: int => t('a) = "Array";
+
+
[@bs.get] external size: t('a) => int = "length";
+
[@bs.get_index] external get: (t('a), int) => option('a) = "";
+
[@bs.get_index] external getUnsafe: (t('a), int) => 'a = "";
+
[@bs.set_index] external setUnsafe: (t('a), int, 'a) => unit = "";
+
+
[@bs.send] external fill: (t('a), 'a) => unit = "fill";
+
[@bs.send] external reverseInPlace: t('a) => unit = "reverse";
+
+
[@bs.send] external copy: t('a) => t('a) = "slice";
+
[@bs.send]
+
external slice: (t('a), ~start: int, ~end_: int) => t('a) = "slice";
+
[@bs.send] external sliceFrom: (t('a), int) => t('a) = "slice";
+
[@bs.send] external append: (t('a), 'a) => t('a) = "concat";
+
[@bs.send] external concat: (t('a), t('a)) => t('a) = "concat";
+
+
[@bs.send] external map: (t('a), 'a => 'b) => t('b) = "map";
+
[@bs.send] external mapi: (t('a), ('a, int) => 'b) => t('b) = "map";
+
[@bs.send] external some: (t('a), 'a => bool) => bool = "some";
+
[@bs.send] external somei: (t('a), ('a, int) => bool) => bool = "some";
+
[@bs.send] external every: (t('a), 'a => bool) => bool = "every";
+
[@bs.send] external everyi: (t('a), ('a, int) => bool) => bool = "every";
+
[@bs.send] external filter: (t('a), 'a => bool) => t('a) = "filter";
+
[@bs.send] external filteri: (t('a), ('a, int) => bool) => t('a) = "filter";
+
[@bs.send] external find: (t('a), 'a => bool) => option('a) = "find";
+
[@bs.send] external findi: (t('a), ('a, int) => bool) => option('a) = "find";
+
[@bs.send] external findIndex: (t('a), 'a => bool) => int = "findIndex";
+
[@bs.send] external forEach: (t('a), 'a => unit) => unit = "forEach";
+
[@bs.send] external forEachi: (t('a), ('a, int) => unit) => unit = "forEach";
+
[@bs.send] external reduce: (t('a), ('b, 'a) => 'b, 'b) => 'b = "reduce";
+
[@bs.send]
+
external reducei: (t('a), ('b, 'a, int) => 'b, 'b) => 'b = "reduce";
+
[@bs.send]
+
external reduceRight: (t('a), ('b, 'a) => 'b, 'b) => 'b = "reduceRight";
+
+
[@bs.send] external indexOf: (t('a), 'a) => int = "indexOf";
+
[@bs.send] external lastIndexOf: (t('a), 'a) => int = "lastIndexOf";
+
+
/* No need to replicate what Belt already has */
+
let shuffle = Belt.Array.shuffle;
+
let shuffleInPlace = Belt.Array.shuffleInPlace;
+
+
let make = (len: int, vals: 'a): t('a) => {
+
let res = makeUninitialized(len);
+
fill(res, vals);
+
res;
+
};
+
+
let set = (arr: t('a), index: int, x: 'a) =>
+
if (index < size(arr) && index >= 0) {
+
setUnsafe(arr, index, x);
+
true;
+
} else {
+
false;
+
};
+
+
let reverse = (arr: t('a)): t('a) => {
+
let res = copy(arr);
+
reverseInPlace(arr);
+
res;
+
};
+
+
let includes = (arr: t('a), x: 'a): bool => indexOf(arr, x) > (-1);
+
+
[@bs.send] external removeInPlace: (t('a), int) => t('a) = "splice";
+
[@bs.send]
+
external removeCountInPlace: (t('a), ~pos: int, ~count: int) => t('a) =
+
"splice";
+
+
let remove = (arr: t('a), pos: int) => removeInPlace(copy(arr), pos);
+
+
let removeCount = (arr: t('a), ~pos: int, ~count: int) =>
+
removeCountInPlace(copy(arr), ~pos, ~count);
+
+
module Js = {
+
[@bs.send] external push: (t('a), 'a) => unit = "push";
+
[@bs.send] external pop: t('a) => option('a) = "pop";
+
[@bs.send] external unshift: (t('a), 'a) => unit = "unshift";
+
[@bs.send] external shift: t('a) => option('a) = "shift";
+
+
[@bs.scope ("Array", "prototype", "push")] [@bs.val]
+
external pushMany: (t('a), t('a)) => unit = "apply";
+
[@bs.scope ("Array", "prototype", "unshift")] [@bs.val]
+
external unshiftMany: (t('a), t('a)) => unit = "apply";
+
+
[@bs.send]
+
external spliceInPlace:
+
(t('a), ~pos: int, ~remove: int, ~add: t('a)) => t('a) =
+
"splice";
+
+
let splice = (arr: t('a), ~pos: int, ~remove: int, ~add: t('a)) =>
+
spliceInPlace(copy(arr), ~pos, ~remove, ~add);
+
};
+31
include/rebel_js/MutableQueue_js.re
···
···
+
type t('a) = array('a);
+
+
external fromArray: array('a) => t('a) = "%identity";
+
external toArray: t('a) => array('a) = "%identity";
+
[@bs.new] external make: unit => t('a) = "Array";
+
[@bs.set] external clear: (t('a), [@bs.as 0] _) => unit = "length";
+
[@bs.send] external add: (t('a), 'a) => unit = "push";
+
[@bs.get] external peek: t('a) => option('a) = "0";
+
[@bs.send] external pop: t('a) => option('a) = "shift";
+
[@bs.send] external copy: t('a) => t('a) = "slice";
+
[@bs.get] external size: t('a) => int = "length";
+
[@bs.send] external mapU: (t('a), (. 'a) => 'b) => t('b) = "map";
+
[@bs.send] external map: (t('a), 'a => 'b) => t('b) = "map";
+
[@bs.send] external forEachU: (t('a), (. 'a) => unit) => unit = "forEach";
+
[@bs.send] external forEach: (t('a), 'a => unit) => unit = "forEach";
+
+
let isEmpty = (q: t('a)): bool => size(q) === 0;
+
+
let reduceU = (q: t('a), accu: 'b, f: (. 'b, 'a) => 'b): 'b =>
+
Js.Array.reduce((acc, x) => f(. acc, x), accu, q);
+
+
let reduce = (q: t('a), accu: 'b, f: ('b, 'a) => 'b): 'b =>
+
Js.Array.reduce(f, accu, q);
+
+
[@bs.scope ("Array", "prototype", "push")] [@bs.val]
+
external addMany: (t('a), t('a)) => unit = "apply";
+
+
let transfer = (q1: t('a), q2: t('a)) => {
+
addMany(q1, q2);
+
clear(q1);
+
};
+19
include/rebel_js/MutableStack_js.re
···
···
+
type t('a) = array('a);
+
+
module Helpers = {
+
[@bs.get_index] external get: (t('a), int) => option('a) = "";
+
};
+
+
[@bs.new] external make: unit => t('a) = "Array";
+
[@bs.set] external clear: (t('a), [@bs.as 0] _) => unit = "length";
+
[@bs.send] external push: (t('a), 'a) => unit = "push";
+
[@bs.send] external pop: t('a) => option('a) = "pop";
+
[@bs.send] external copy: t('a) => t('a) = "slice";
+
[@bs.get] external size: t('a) => int = "length";
+
[@bs.send] external forEachU: (t('a), (. 'a) => unit) => unit = "forEach";
+
[@bs.send] external forEach: (t('a), 'a => unit) => unit = "forEach";
+
+
let isEmpty = (stack: t('a)): bool => size(stack) === 0;
+
+
let top = (stack: t('a)): option('a) =>
+
Helpers.get(stack, size(stack) - 1);
+3
include/rebel_js/Rebel_js.re
···
···
+
module Array = Array_js;
+
module MutableStack = MutableStack_js;
+
module MutableQueue = MutableQueue_js;
+170
include/rebel_native/Array_native.re
···
···
+
type t('a) = array('a);
+
+
let makeEmpty = (): t('a) => [||];
+
let makeUninitialized = Belt.Array.makeUninitializedUnsafe;
+
let make = Belt.Array.make;
+
+
let size = Belt.Array.size;
+
let get = Belt.Array.get;
+
let getUnsafe = Belt.Array.getUnsafe;
+
let set = Belt.Array.set;
+
let setUnsafe = Belt.Array.setUnsafe;
+
+
let fill = (arr: t('a), x: 'a) =>
+
Belt.Array.fill(arr, ~offset=0, ~len=size(arr), x);
+
+
let reverseInPlace = Belt.Array.reverseInPlace;
+
let reverse = Belt.Array.reverse;
+
let shuffle = Belt.Array.shuffle;
+
let shuffleInPlace = Belt.Array.shuffleInPlace;
+
+
let copy = Belt.Array.copy;
+
+
let slice = (arr: t('a), ~start: int, ~end_: int): t('a) => {
+
let len = end_ - start;
+
Belt.Array.slice(arr, ~offset=start, ~len);
+
};
+
+
let sliceFrom = Belt.Array.sliceToEnd;
+
let concat = Belt.Array.concat;
+
+
let append = (arr: t('a), x: 'a) => Belt.Array.concat(arr, [|x|]);
+
+
let somei = (arr: t('a), f: ('a, int) => bool): bool => {
+
let len = size(arr);
+
let rec search = (i: int) =>
+
if (i >= len) {
+
false;
+
} else if (f(getUnsafe(arr, i), i)) {
+
true;
+
} else {
+
search(i + 1);
+
};
+
+
search(0);
+
};
+
+
let everyi = (arr: t('a), f: ('a, int) => bool): bool => {
+
let len = size(arr);
+
let rec search = (i: int) =>
+
if (i >= len) {
+
true;
+
} else if (!f(getUnsafe(arr, i), i)) {
+
false;
+
} else {
+
search(i + 1);
+
};
+
+
search(0);
+
};
+
+
let findi = (arr: t('a), f: ('a, int) => bool): option('a) => {
+
let len = size(arr);
+
let rec search = (i: int) =>
+
if (i >= len) {
+
None;
+
} else {
+
let x = getUnsafe(arr, i);
+
if (f(x, i)) {
+
Some(x);
+
} else {
+
search(i + 1);
+
};
+
};
+
+
search(0);
+
};
+
+
let findIndex = (arr: t('a), f: 'a => bool): int => {
+
let len = size(arr);
+
let rec search = (i: int) =>
+
if (i >= len) {
+
(-1);
+
} else if (f(getUnsafe(arr, i))) {
+
i;
+
} else {
+
search(i + 1);
+
};
+
+
search(0);
+
};
+
+
let lastIndexOf = (arr: t('a), x: 'a): int => {
+
let len = size(arr);
+
let rec search = (i: int) =>
+
if (i < 0) {
+
(-1);
+
} else if (x === getUnsafe(arr, i)) {
+
i;
+
} else {
+
search(i - 1);
+
};
+
+
search(len - 1);
+
};
+
+
let filteri = (arr: t('a), f: ('a, int) => bool): t('a) => {
+
let len = size(arr);
+
let res = makeUninitialized(len);
+
let j = ref(-1);
+
+
let rec filter = (i: int) =>
+
if (i >= len) {
+
Belt.Array.truncateToLengthUnsafe(res, j^ + 1);
+
res;
+
} else {
+
let x = getUnsafe(arr, i);
+
if (f(x, i)) {
+
j := j^ + 1;
+
Belt.Array.setUnsafe(arr, j^, x);
+
};
+
+
filter(i + 1);
+
};
+
+
filter(0);
+
};
+
+
let removeCount = (arr: t('a), ~pos: int, ~count: int): t('a) => {
+
let len = size(arr);
+
let pos2 = pos + count - 1;
+
let res = makeUninitialized(len - count);
+
+
let rec copy = (i: int) =>
+
if (i >= len) {
+
res;
+
} else if (i >= pos && i <= pos2) {
+
copy(i + 1);
+
} else {
+
let j = i > pos2 ? i - count : i;
+
Belt.Array.setUnsafe(arr, j, Belt.Array.getUnsafe(arr, i));
+
copy(i + 1);
+
};
+
+
copy(0);
+
};
+
+
let find = (arr: t('a), f: 'a => bool): option('a) =>
+
findi(arr, (x, _i) => f(x));
+
let indexOf = (arr: t('a), x: 'a): int => findIndex(arr, item => item === x);
+
let includes = (arr: t('a), x: 'a): bool =>
+
findIndex(arr, item => item === x) > (-1);
+
let filter = (arr: t('a), f: 'a => bool): t('a) =>
+
filteri(arr, (x, _i) => f(x));
+
let remove = (arr: t('a), index: int): t('a) =>
+
removeCount(arr, ~pos=index, ~count=1);
+
+
let some = Belt.Array.some;
+
let every = Belt.Array.every;
+
let map = Belt.Array.map;
+
let mapi = (arr: t('a), f: ('a, int) => 'b): t('b) =>
+
Belt.Array.mapWithIndexU(arr, (. i, x) => f(x, i));
+
let forEach = Belt.Array.forEach;
+
let forEachi = (arr: t('a), f: ('a, int) => unit): unit =>
+
Belt.Array.forEachWithIndexU(arr, (. i, x) => f(x, i));
+
let reduce = (arr: t('a), reducer: ('b, 'a) => 'b, acc: 'b): 'b =>
+
Belt.Array.reduce(arr, acc, reducer);
+
let reducei = (arr: t('a), reducer: ('b, 'a, int) => 'b, acc: 'b): 'b =>
+
Belt.Array.reduceWithIndex(arr, acc, reducer);
+
let reduceRight = (arr: t('a), reducer: ('b, 'a) => 'b, acc: 'b): 'b =>
+
Belt.Array.reduceReverse(arr, acc, reducer);
+24
include/rebel_native/MutableQueue_native.re
···
···
+
type t('a) = Belt.MutableQueue.t('a);
+
+
let fromArray = Belt.MutableQueue.fromArray;
+
let toArray = Belt.MutableQueue.toArray;
+
let make = Belt.MutableQueue.make;
+
let clear = Belt.MutableQueue.clear;
+
let add = Belt.MutableQueue.add;
+
let peek = Belt.MutableQueue.peek;
+
let pop = Belt.MutableQueue.pop;
+
let copy = Belt.MutableQueue.copy;
+
let size = Belt.MutableQueue.size;
+
let mapU = Belt.MutableQueue.mapU;
+
let map = Belt.MutableQueue.map;
+
let forEachU = Belt.MutableQueue.forEachU;
+
let forEach = Belt.MutableQueue.forEach;
+
+
let isEmpty = Belt.MutableQueue.isEmpty;
+
let reduceU = Belt.MutableQueue.reduceU;
+
let reduce = Belt.MutableQueue.reduce;
+
+
let addMany = (q1: t('a), q2: t('a)) =>
+
Belt.MutableQueue.transfer(copy(q1), q2);
+
+
let transfer = Belt.MutableQueue.transfer;
+13
include/rebel_native/MutableStack_native.re
···
···
+
type t('a) = Belt.MutableStack.t('a);
+
+
let make = Belt.MutableStack.make;
+
let clear = Belt.MutableStack.clear;
+
let push = Belt.MutableStack.push;
+
let pop = Belt.MutableStack.pop;
+
let copy = Belt.MutableStack.copy;
+
let size = Belt.MutableStack.size;
+
let forEachU = Belt.MutableStack.forEachU;
+
let forEach = Belt.MutableStack.forEach;
+
+
let isEmpty = Belt.MutableStack.isEmpty;
+
let top = Belt.MutableStack.top;
+3
include/rebel_native/Rebel_native.re
···
···
+
module Array = Array_native;
+
module MutableStack = MutableStack_native;
+
module MutableQueue = MutableQueue_native;
+2 -10
package.json
···
"homepage": "https://github.com/kitten/wonka",
"bugs": "https://github.com/kitten/wonka/issues",
"license": "MIT",
-
"dependencies": {
-
"bs-rebel": "^0.2.3"
-
},
"devDependencies": {
"@glennsl/bs-jest": "^0.4.8",
"bs-platform": "^5.0.4",
···
"testMatch": [
"**/lib/js/__tests__/*_test.js"
]
-
},
-
"bundlesize": [
-
{
-
"path": "./dist/wonka.es.js",
-
"maxSize": "9 kB"
-
}
-
]
}
···
"homepage": "https://github.com/kitten/wonka",
"bugs": "https://github.com/kitten/wonka/issues",
"license": "MIT",
+
"dependencies": {},
"devDependencies": {
"@glennsl/bs-jest": "^0.4.8",
"bs-platform": "^5.0.4",
···
"testMatch": [
"**/lib/js/__tests__/*_test.js"
]
+
}
}
+3 -31
src/wonka.ml
···
module Types = Wonka_types
-
(* sources *)
-
include Wonka_source_fromArray
-
include Wonka_source_fromList
-
include Wonka_source_fromValue
-
include Wonka_source_make
-
include Wonka_source_makeSubject
-
include Wonka_source_primitives
-
-
(* operators *)
-
include Wonka_operator_combine
-
include Wonka_operator_concatMap
-
include Wonka_operator_filter
-
include Wonka_operator_map
-
include Wonka_operator_mergeMap
-
include Wonka_operator_onEnd
-
include Wonka_operator_onPush
-
include Wonka_operator_onStart
-
include Wonka_operator_scan
-
include Wonka_operator_share
-
include Wonka_operator_skip
-
include Wonka_operator_skipUntil
-
include Wonka_operator_skipWhile
-
include Wonka_operator_switchMap
-
include Wonka_operator_take
-
include Wonka_operator_takeLast
-
include Wonka_operator_takeUntil
-
include Wonka_operator_takeWhile
-
-
(* sinks *)
-
include Wonka_sink_publish
-
include Wonka_sink_subscribe
#if BS_NATIVE then
#if BSB_BACKEND = "js" then
···
module Types = Wonka_types
+
include Wonka_sources
+
include Wonka_operators
+
include Wonka_sinks
#if BS_NATIVE then
#if BSB_BACKEND = "js" then
+18
src/wonka_operators.re
···
···
+
include Wonka_operator_combine;
+
include Wonka_operator_concatMap;
+
include Wonka_operator_filter;
+
include Wonka_operator_map;
+
include Wonka_operator_mergeMap;
+
include Wonka_operator_onEnd;
+
include Wonka_operator_onPush;
+
include Wonka_operator_onStart;
+
include Wonka_operator_scan;
+
include Wonka_operator_share;
+
include Wonka_operator_skip;
+
include Wonka_operator_skipUntil;
+
include Wonka_operator_skipWhile;
+
include Wonka_operator_switchMap;
+
include Wonka_operator_take;
+
include Wonka_operator_takeLast;
+
include Wonka_operator_takeUntil;
+
include Wonka_operator_takeWhile;
+2
src/wonka_sinks.re
···
···
+
include Wonka_sink_publish;
+
include Wonka_sink_subscribe;
+6
src/wonka_sources.re
···
···
+
include Wonka_source_fromArray;
+
include Wonka_source_fromList;
+
include Wonka_source_fromValue;
+
include Wonka_source_make;
+
include Wonka_source_makeSubject;
+
include Wonka_source_primitives;
-5
yarn.lock
···
resolved "https://registry.yarnpkg.com/bs-platform/-/bs-platform-5.0.4.tgz#d406ef43c12d1b19d8546884d8b5b4e0fb709372"
integrity sha512-rXM+ztN8wYXQ4ojfFGylvPOf8GRLOvM94QJsMMV9VpsLChKCjesWMNybTZvpoyNsESu2nC5q+C9soG+BPhuUFQ==
-
bs-rebel@^0.2.3:
-
version "0.2.3"
-
resolved "https://registry.yarnpkg.com/bs-rebel/-/bs-rebel-0.2.3.tgz#11e1a95a4a3f16311575e8853a004cec6b9d19de"
-
integrity sha512-NTDUSkJ+KkIqmKHUE48luD2YaYh49XaU1zVSSk9lJ6KFNQzlRQnIfR+paNWYyvzxf5+TZ2inVgxBUHdCsZEiYA==
-
bser@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
···
resolved "https://registry.yarnpkg.com/bs-platform/-/bs-platform-5.0.4.tgz#d406ef43c12d1b19d8546884d8b5b4e0fb709372"
integrity sha512-rXM+ztN8wYXQ4ojfFGylvPOf8GRLOvM94QJsMMV9VpsLChKCjesWMNybTZvpoyNsESu2nC5q+C9soG+BPhuUFQ==
bser@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"