Simple testing and manipulations
This commit is contained in:
parent
9e5561a7b8
commit
db023c0bef
46
__tests__/Foo/Foo__Test.re
Normal file
46
__tests__/Foo/Foo__Test.re
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
open Jest;
|
||||||
|
open Expect;
|
||||||
|
|
||||||
|
let shape: DistributionTypes.xyShape = {
|
||||||
|
xs: [|1., 4., 8.|],
|
||||||
|
ys: [|8., 9., 2.|],
|
||||||
|
};
|
||||||
|
|
||||||
|
open Shape;
|
||||||
|
|
||||||
|
describe("Shape", () =>
|
||||||
|
describe("XYShape", () => {
|
||||||
|
test("#ySum", () =>
|
||||||
|
expect(XYShape.ySum(shape)) |> toEqual(19.0)
|
||||||
|
);
|
||||||
|
test("#volume", () => {
|
||||||
|
let shape: DistributionTypes.xyShape = {
|
||||||
|
xs: [|1., 5., 10.|],
|
||||||
|
ys: [|1., 2., 2.|],
|
||||||
|
};
|
||||||
|
expect(XYShape.volume(shape)) |> toEqual(Some(7.0));
|
||||||
|
});
|
||||||
|
test("#integral", () => {
|
||||||
|
let expected: DistributionTypes.xyShape = {
|
||||||
|
xs: [|1., 4., 8.|],
|
||||||
|
ys: [|8., 17., 19.|],
|
||||||
|
};
|
||||||
|
expect(XYShape.volum2(shape)) |> toEqual(Some(expected));
|
||||||
|
});
|
||||||
|
test("#derivative", () => {
|
||||||
|
let expected: DistributionTypes.xyShape = {
|
||||||
|
xs: [|1., 4., 8.|],
|
||||||
|
ys: [|8., 1., 1.|],
|
||||||
|
};
|
||||||
|
expect(XYShape.derivative(shape)) |> toEqual(expected);
|
||||||
|
});
|
||||||
|
// test("#both", () => {
|
||||||
|
// let expected: DistributionTypes.xyShape = {
|
||||||
|
// xs: [|1., 4., 8.|],
|
||||||
|
// ys: [|8., 1., 1.|],
|
||||||
|
// };
|
||||||
|
// expect(shape |> XYShape.derivative |> XYShape.integral)
|
||||||
|
// |> toEqual(shape);
|
||||||
|
// });
|
||||||
|
})
|
||||||
|
);
|
|
@ -11,6 +11,11 @@
|
||||||
"dir": "showcase",
|
"dir": "showcase",
|
||||||
"type": "dev",
|
"type": "dev",
|
||||||
"subdirs": true
|
"subdirs": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dir": "__tests__",
|
||||||
|
"type": "dev",
|
||||||
|
"subdirs": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"bsc-flags": ["-bs-super-errors", "-bs-no-version-header"],
|
"bsc-flags": ["-bs-super-errors", "-bs-no-version-header"],
|
||||||
|
@ -21,6 +26,7 @@
|
||||||
"suffix": ".bs.js",
|
"suffix": ".bs.js",
|
||||||
"namespace": true,
|
"namespace": true,
|
||||||
"bs-dependencies": [
|
"bs-dependencies": [
|
||||||
|
"@glennsl/bs-jest",
|
||||||
"@foretold/components",
|
"@foretold/components",
|
||||||
"bs-ant-design-alt",
|
"bs-ant-design-alt",
|
||||||
"reason-react",
|
"reason-react",
|
||||||
|
|
|
@ -13,7 +13,10 @@
|
||||||
"server": "moduleserve ./ --port 8000",
|
"server": "moduleserve ./ --port 8000",
|
||||||
"predeploy": "parcel build ./src/index.html --no-source-maps --no-autoinstall",
|
"predeploy": "parcel build ./src/index.html --no-source-maps --no-autoinstall",
|
||||||
"deploy": "gh-pages -d dist",
|
"deploy": "gh-pages -d dist",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "jest",
|
||||||
|
"test:ci": "yarn jest",
|
||||||
|
"watch:test": "jest --watchAll",
|
||||||
|
"watch:s": "yarn jest -- Converter_test --watch"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"BuckleScript",
|
"BuckleScript",
|
||||||
|
@ -26,13 +29,16 @@
|
||||||
"@foretold/cdf": "^1.0.15",
|
"@foretold/cdf": "^1.0.15",
|
||||||
"@foretold/components": "^0.0.3",
|
"@foretold/components": "^0.0.3",
|
||||||
"@foretold/guesstimator": "^1.0.10",
|
"@foretold/guesstimator": "^1.0.10",
|
||||||
|
"@glennsl/bs-jest": "^0.4.9",
|
||||||
"antd": "3.17.0",
|
"antd": "3.17.0",
|
||||||
"autoprefixer": "^9.7.4",
|
"autoprefixer": "^9.7.4",
|
||||||
|
"babel-jest": "^25.1.0",
|
||||||
"bs-ant-design-alt": "2.0.0-alpha.31",
|
"bs-ant-design-alt": "2.0.0-alpha.31",
|
||||||
"bs-css": "^11.0.0",
|
"bs-css": "^11.0.0",
|
||||||
"bs-moment": "0.4.4",
|
"bs-moment": "0.4.4",
|
||||||
"bs-reform": "9.7.1",
|
"bs-reform": "9.7.1",
|
||||||
"d3": "^5.15.0",
|
"d3": "^5.15.0",
|
||||||
|
"jest": "^25.1.0",
|
||||||
"lenses-ppx": "4.0.0",
|
"lenses-ppx": "4.0.0",
|
||||||
"less": "^3.10.3",
|
"less": "^3.10.3",
|
||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.15",
|
||||||
|
|
|
@ -25,6 +25,7 @@ module XYShape = {
|
||||||
|
|
||||||
let ySum = yFold((a, b) => a +. b);
|
let ySum = yFold((a, b) => a +. b);
|
||||||
|
|
||||||
|
let fromArray = ((xs, ys)): t => {xs, ys};
|
||||||
let fromArrays = (xs, ys): t => {xs, ys};
|
let fromArrays = (xs, ys): t => {xs, ys};
|
||||||
|
|
||||||
let transverse = (fn, p: t) => {
|
let transverse = (fn, p: t) => {
|
||||||
|
@ -33,7 +34,8 @@ module XYShape = {
|
||||||
->Belt.Array.reduce([||], (items, (x, y)) =>
|
->Belt.Array.reduce([||], (items, (x, y)) =>
|
||||||
switch (_lastElement(items)) {
|
switch (_lastElement(items)) {
|
||||||
| Some((_, yLast)) =>
|
| Some((_, yLast)) =>
|
||||||
Belt.Array.concat(items, [|(x, fn(y, yLast))|])
|
Js.log3(y, yLast, fn(y, yLast));
|
||||||
|
Belt.Array.concat(items, [|(x, fn(y, yLast))|]);
|
||||||
| None => [|(x, y)|]
|
| None => [|(x, y)|]
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -41,19 +43,68 @@ module XYShape = {
|
||||||
fromArrays(xs, ys);
|
fromArrays(xs, ys);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type zippedRange = ((float, float), (float, float));
|
||||||
|
|
||||||
|
let inRanges = (fn, t: t) => {
|
||||||
|
let ranges: Belt.Result.t(array(zippedRange), string) =
|
||||||
|
Belt.Array.zip(t.xs, t.ys) |> E.A.toRanges;
|
||||||
|
ranges |> E.R.toOption |> E.O.fmap(fn);
|
||||||
|
};
|
||||||
|
|
||||||
|
let sum = Belt.Array.reduce(_, 0., (a, b) => a +. b);
|
||||||
|
|
||||||
|
let volume = {
|
||||||
|
let assumeLastY = (((lastX, lastY), (nextX, _)): zippedRange) =>
|
||||||
|
(nextX -. lastX) *. lastY;
|
||||||
|
|
||||||
|
inRanges((inRanges: array(zippedRange)) =>
|
||||||
|
Belt.Array.map(inRanges, assumeLastY) |> sum
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
let volumeTriangle = {
|
||||||
|
let assumeLastY = (((lastX, lastY), (nextX, nextY)): zippedRange) =>
|
||||||
|
(nextX -. lastX) *. (lastY -. nextY) /. 2.;
|
||||||
|
|
||||||
|
inRanges((inRanges: array(zippedRange)) =>
|
||||||
|
Belt.Array.map(inRanges, assumeLastY) |> sum
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
let volum2 = {
|
||||||
|
let assumeLastY = (((lastX, lastY), (nextX, _)): zippedRange) => (
|
||||||
|
nextX,
|
||||||
|
(nextX -. lastX) *. lastY,
|
||||||
|
);
|
||||||
|
|
||||||
|
inRanges((inRanges: array(zippedRange)) =>
|
||||||
|
Belt.Array.map(inRanges, assumeLastY) |> Belt.Array.unzip |> fromArray
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
let diff = {
|
||||||
|
let assumeLastY = (((lastX, lastY), (nextX, _)): zippedRange) => (
|
||||||
|
nextX,
|
||||||
|
(lastY -. lastY) /. (nextX -. lastX),
|
||||||
|
);
|
||||||
|
|
||||||
|
inRanges((inRanges: array(zippedRange)) =>
|
||||||
|
Belt.Array.map(inRanges, assumeLastY) |> Belt.Array.unzip |> fromArray
|
||||||
|
);
|
||||||
|
};
|
||||||
let getY = (t: t, x: float) => x;
|
let getY = (t: t, x: float) => x;
|
||||||
|
let findY = (t: t, x: float) => x;
|
||||||
|
|
||||||
let integral = transverse((aCurrent, aLast) => aCurrent +. aLast);
|
let integral = transverse((aCurrent, aLast) => aCurrent +. aLast);
|
||||||
let derivative = transverse((aCurrent, aLast) => aCurrent -. aLast);
|
let derivative = transverse((aCurrent, aLast) => aCurrent -. aLast);
|
||||||
|
// let massWithin = (t: t, left: pointInRange, right: pointInRange) => {
|
||||||
let massWithin = (t: t, left: pointInRange, right: pointInRange) => {
|
// switch (left, right) {
|
||||||
switch (left, right) {
|
// | (Unbounded, Unbounded) => t |> ySum
|
||||||
| (Unbounded, Unbounded) => t |> ySum
|
// | (Unbounded, X(f)) => t |> integral |> getY(t, 3.0)
|
||||||
| (Unbounded, X(f)) => t |> integral |> getY(_, f)
|
// | (X(f), Unbounded) => ySum(t) -. getY(integral(t), f)
|
||||||
| (X(f), Unbounded) => ySum(t) -. getY(integral(t), f)
|
// | (X(l), X(r)) => getY(integral(t), r) -. getY(integral(t), l)
|
||||||
| (X(l), X(r)) => getY(integral(t), r) -. getY(integral(t), l)
|
// };
|
||||||
};
|
// };
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module Continuous = {
|
module Continuous = {
|
||||||
|
|
19
src/lib/E.re
19
src/lib/E.re
|
@ -114,6 +114,11 @@ module R = {
|
||||||
let id = e => e |> result(U.id, U.id);
|
let id = e => e |> result(U.id, U.id);
|
||||||
let fmap = Rationale.Result.fmap;
|
let fmap = Rationale.Result.fmap;
|
||||||
let bind = Rationale.Result.bind;
|
let bind = Rationale.Result.bind;
|
||||||
|
let toOption = (e: Belt.Result.t('a, 'b)) =>
|
||||||
|
switch (e) {
|
||||||
|
| Ok(r) => Some(r)
|
||||||
|
| Error(_) => None
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
let safe_fn_of_string = (fn, s: string): option('a) =>
|
let safe_fn_of_string = (fn, s: string): option('a) =>
|
||||||
|
@ -217,6 +222,20 @@ module A = {
|
||||||
let concatMany = Belt.Array.concatMany;
|
let concatMany = Belt.Array.concatMany;
|
||||||
let keepMap = Belt.Array.keepMap;
|
let keepMap = Belt.Array.keepMap;
|
||||||
let stableSortBy = Belt.SortArray.stableSortBy;
|
let stableSortBy = Belt.SortArray.stableSortBy;
|
||||||
|
let toRanges = (a: array('a)) =>
|
||||||
|
switch (a |> Belt.Array.length) {
|
||||||
|
| 0
|
||||||
|
| 1 => Belt.Result.Error("Must be at least 2 elements")
|
||||||
|
| n =>
|
||||||
|
Belt.Array.makeBy(n - 1, r => r)
|
||||||
|
|> Belt.Array.map(_, index =>
|
||||||
|
(
|
||||||
|
Belt.Array.getUnsafe(a, index),
|
||||||
|
Belt.Array.getUnsafe(a, index + 1),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|> Rationale.Result.return
|
||||||
|
};
|
||||||
|
|
||||||
let asList = (f: list('a) => list('a), r: array('a)) =>
|
let asList = (f: list('a) => list('a), r: array('a)) =>
|
||||||
r |> to_list |> f |> of_list;
|
r |> to_list |> f |> of_list;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user