Run prettier on monorepo + fix crashing playground
This commit is contained in:
parent
26433c5289
commit
440bfabffa
7
.github/ISSUE_TEMPLATE/developer-bug.md
vendored
7
.github/ISSUE_TEMPLATE/developer-bug.md
vendored
|
@ -1,14 +1,13 @@
|
|||
---
|
||||
name: Developer friction when contributing to Squiggle
|
||||
about: Did your yarn scripts fail? Did the CI diverge from a README? Have a testing-related task? Etc.
|
||||
labels: 'ops & testing'
|
||||
labels: "ops & testing"
|
||||
---
|
||||
|
||||
# Description:
|
||||
|
||||
|
||||
# The OS and version, yarn version, etc. in which this came up
|
||||
|
||||
_delete this section if testing task_
|
||||
|
||||
# Desired behavior
|
||||
|
||||
|
||||
|
|
3
.github/ISSUE_TEMPLATE/future.md
vendored
3
.github/ISSUE_TEMPLATE/future.md
vendored
|
@ -2,6 +2,5 @@
|
|||
name: Idea or feature request
|
||||
about: Where would you like to see Squiggle go over the next few months, several months, or few years?
|
||||
---
|
||||
|
||||
# Description
|
||||
|
||||
|
||||
|
|
13
.github/ISSUE_TEMPLATE/pl.md
vendored
13
.github/ISSUE_TEMPLATE/pl.md
vendored
|
@ -1,14 +1,13 @@
|
|||
---
|
||||
name: Regarding the programming language
|
||||
about: Interpreter, parser, syntax, semantics, and including distributions
|
||||
labels: 'programming language'
|
||||
labels: "programming language"
|
||||
---
|
||||
|
||||
<!-- mark one with an x -->
|
||||
- _ Is refactor
|
||||
- _ Is new feature
|
||||
- _ Concerns documentation
|
||||
|
||||
- \_ Is refactor
|
||||
- \_ Is new feature
|
||||
- \_ Concerns documentation
|
||||
|
||||
# Description of suggestion or shortcoming:
|
||||
|
||||
|
||||
|
||||
|
|
7
.github/ISSUE_TEMPLATE/user-bug.md
vendored
7
.github/ISSUE_TEMPLATE/user-bug.md
vendored
|
@ -1,18 +1,17 @@
|
|||
---
|
||||
name: Bug reports for Squiggle users
|
||||
about: Rendering oddly, trouble with the playground, something like this?
|
||||
labels: 'bug'
|
||||
labels: "bug"
|
||||
---
|
||||
|
||||
# Description:
|
||||
|
||||
|
||||
# Steps to reproduce:
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
# Expected behavior:
|
||||
|
||||
|
||||
# What I got instead:
|
||||
|
||||
|
|
1
.github/workflows/ci.yaml
vendored
1
.github/workflows/ci.yaml
vendored
|
@ -8,7 +8,6 @@ on:
|
|||
- staging
|
||||
|
||||
jobs:
|
||||
|
||||
pre_check:
|
||||
name: Precheck for skipping redundant jobs
|
||||
runs-on: ubuntu-latest
|
||||
|
|
4
.github/workflows/codeql-analysis.yml
vendored
4
.github/workflows/codeql-analysis.yml
vendored
|
@ -22,7 +22,7 @@ on:
|
|||
- master
|
||||
- staging
|
||||
schedule:
|
||||
- cron: '42 19 * * 0'
|
||||
- cron: "42 19 * * 0"
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
|
@ -36,7 +36,7 @@ jobs:
|
|||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'javascript' ]
|
||||
language: ["javascript"]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
||||
|
||||
|
|
9
.prettierignore
Normal file
9
.prettierignore
Normal file
|
@ -0,0 +1,9 @@
|
|||
.direnv
|
||||
*.bs.js
|
||||
*.gen.tsx
|
||||
packages/*/dist
|
||||
packages/components/storybook-static
|
||||
node_modules
|
||||
packages/*/node_modules
|
||||
packages/website/.docusaurus
|
||||
packages/squiggle-lang/lib
|
|
@ -21,6 +21,7 @@ Anyone (with a github account) can file an issue at any time. Please allow Quinn
|
|||
# Project structure
|
||||
|
||||
Squiggle is a **monorepo** with four **packages**.
|
||||
|
||||
- **components** is where we improve reactive interfacing with Squiggle
|
||||
- **playground** is the site `playground.squiggle-language.com`
|
||||
- **squiggle-lang** is where the magic happens: probability distributions, the interpreter, etc.
|
||||
|
@ -41,6 +42,7 @@ We aspire for `ci.yaml` and `README.md`s to be in one-to-one correspondence.
|
|||
## If you're on NixOS
|
||||
|
||||
You'll need to run a command like this in order to get `yarn build` to run, especially in `packages/squiggle-lang`.
|
||||
|
||||
```sh
|
||||
patchelf --set-interpreter $(patchelf --print-interpreter $(which mkdir)) ./node_modules/gentype/gentype.exe
|
||||
```
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
# Squiggle
|
||||
|
||||
![Packages check](https://github.com/QURIresearch/squiggle/actions/workflows/ci.yaml/badge.svg)
|
||||
[![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-lang.svg)](https://www.npmjs.com/package/@quri/squiggle-lang)
|
||||
[![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-components.svg)](https://www.npmjs.com/package/@quri/squiggle-components)
|
||||
|
@ -12,6 +13,7 @@ This is an experimental DSL/language for making probabilistic estimates. The ful
|
|||
- **old playground**: https://playground.squiggle-language.com
|
||||
|
||||
## Packages
|
||||
|
||||
This monorepo has several packages that can be used for various purposes. All
|
||||
the packages can be found in `packages`.
|
||||
|
||||
|
@ -48,4 +50,5 @@ codium
|
|||
The `nix develop` shell also provides `yarn`.
|
||||
|
||||
# Contributing
|
||||
|
||||
See `CONTRIBUTING.md`.
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
"packages/*"
|
||||
],
|
||||
"resolutions": {
|
||||
"@types/react": "^17.0.43"
|
||||
"@types/react": "^18.0.1",
|
||||
"react": "^18.0.0"
|
||||
},
|
||||
"packageManager": "yarn@1.22.17"
|
||||
}
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
dist
|
||||
build
|
||||
node_modules
|
||||
storybook-static
|
||||
.storybook
|
|
@ -1,31 +1,37 @@
|
|||
//const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
|
||||
const custom = require('../webpack.config.js');
|
||||
const custom = require("../webpack.config.js");
|
||||
|
||||
module.exports = {
|
||||
webpackFinal: async (config) => {
|
||||
config.resolve.alias = custom.resolve.alias;
|
||||
return { ...config, module: { ...config.module, rules: config.module.rules.concat(custom.module.rules.filter(x => x.loader === "ts-loader")) } };
|
||||
return {
|
||||
...config,
|
||||
module: {
|
||||
...config.module,
|
||||
rules: config.module.rules.concat(
|
||||
custom.module.rules.filter((x) => x.loader === "ts-loader")
|
||||
),
|
||||
},
|
||||
"stories": [
|
||||
"../src/**/*.stories.mdx",
|
||||
"../src/**/*.stories.@(js|jsx|ts|tsx)"
|
||||
],
|
||||
"addons": [
|
||||
};
|
||||
},
|
||||
stories: ["../src/**/*.stories.mdx", "../src/**/*.stories.@(js|jsx|ts|tsx)"],
|
||||
addons: [
|
||||
"@storybook/addon-links",
|
||||
"@storybook/addon-essentials",
|
||||
"@storybook/preset-create-react-app"
|
||||
"@storybook/preset-create-react-app",
|
||||
],
|
||||
"framework": "@storybook/react",
|
||||
"core": {
|
||||
"builder": "webpack5"
|
||||
framework: "@storybook/react",
|
||||
core: {
|
||||
builder: "webpack5",
|
||||
},
|
||||
typescript: {
|
||||
check: false,
|
||||
checkOptions: {},
|
||||
reactDocgen: 'react-docgen-typescript',
|
||||
reactDocgen: "react-docgen-typescript",
|
||||
reactDocgenTypescriptOptions: {
|
||||
shouldExtractLiteralValuesFromEnum: true,
|
||||
propFilter: (prop) => (prop.parent ? !/node_modules/.test(prop.parent.fileName) : true),
|
||||
propFilter: (prop) =>
|
||||
prop.parent ? !/node_modules/.test(prop.parent.fileName) : true,
|
||||
},
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
|
@ -6,4 +6,4 @@ export const parameters = {
|
|||
date: /Date$/,
|
||||
},
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
|
@ -15,10 +15,10 @@
|
|||
"cross-env": "^7.0.3",
|
||||
"lodash": "^4.17.21",
|
||||
"react": "^18.0.0",
|
||||
"react-ace": "9.5.0",
|
||||
"react-dom": "^18.0.0",
|
||||
"react-scripts": "5.0.0",
|
||||
"react-vega": "^7.5.0",
|
||||
"react-ace": "9.5.0",
|
||||
"styled-components": "^5.3.5",
|
||||
"tsconfig-paths-webpack-plugin": "^3.5.2",
|
||||
"typescript": "^4.6.3",
|
||||
|
@ -63,9 +63,6 @@
|
|||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/styled-components": "^5.1.24",
|
||||
"css-loader": "^6.7.1",
|
||||
"style-loader": "^3.3.1",
|
||||
"@babel/plugin-proposal-private-property-in-object": "^7.16.7",
|
||||
"@storybook/addon-actions": "^6.4.20",
|
||||
"@storybook/addon-essentials": "^6.4.20",
|
||||
|
@ -75,9 +72,13 @@
|
|||
"@storybook/node-logger": "^6.4.20",
|
||||
"@storybook/preset-create-react-app": "^4.1.0",
|
||||
"@storybook/react": "^6.4.20",
|
||||
"@types/styled-components": "^5.1.24",
|
||||
"@types/webpack": "^4.41.32",
|
||||
"css-loader": "^6.7.1",
|
||||
"prettier": "^2.6.2",
|
||||
"react-codejar": "^1.1.2",
|
||||
"speed-measure-webpack-plugin": "^1.5.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"ts-loader": "^9.2.8",
|
||||
"webpack": "^5.72.0",
|
||||
"webpack-cli": "^4.9.2",
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
import * as React from "react";
|
||||
import _ from "lodash";
|
||||
import type { Spec } from "vega";
|
||||
import type {
|
||||
Distribution,
|
||||
} from "@quri/squiggle-lang";
|
||||
import { distributionErrorToString } from '@quri/squiggle-lang';
|
||||
import type { Distribution } from "@quri/squiggle-lang";
|
||||
import { distributionErrorToString } from "@quri/squiggle-lang";
|
||||
import { createClassFromSpec } from "react-vega";
|
||||
import * as chartSpecification from "../vega-specs/spec-distributions.json";
|
||||
|
||||
|
@ -16,12 +14,14 @@ type DistributionChartProps = {
|
|||
distribution: Distribution;
|
||||
width: number;
|
||||
height: number;
|
||||
}
|
||||
};
|
||||
|
||||
export const DistributionChart: React.FC<DistributionChartProps> = ({ distribution, width, height }: DistributionChartProps) => {
|
||||
console.log("Making shape")
|
||||
export const DistributionChart: React.FC<DistributionChartProps> = ({
|
||||
distribution,
|
||||
width,
|
||||
height,
|
||||
}: DistributionChartProps) => {
|
||||
let shape = distribution.shape();
|
||||
console.log(shape)
|
||||
if (shape.tag === "Ok") {
|
||||
return (
|
||||
<SquiggleVegaChart
|
||||
|
@ -31,8 +31,7 @@ export const DistributionChart: React.FC<DistributionChartProps> = ({ distributi
|
|||
actions={false}
|
||||
/>
|
||||
);
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
return <> {distributionErrorToString(shape.value)} </>;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -7,10 +7,10 @@ const ShowError = styled.div`
|
|||
padding: 0.4em 0.8em;
|
||||
`;
|
||||
|
||||
export const Error: React.FC<{ heading: string; children: React.ReactNode }> = ({
|
||||
heading = "Error",
|
||||
children,
|
||||
}) => {
|
||||
export const ErrorBox: React.FC<{
|
||||
heading: string;
|
||||
children: React.ReactNode;
|
||||
}> = ({ heading = "Error", children }) => {
|
||||
return (
|
||||
<ShowError>
|
||||
<h3>{heading}</h3>
|
|
@ -5,15 +5,13 @@ import type { Distribution, errorValue, result } from "@quri/squiggle-lang";
|
|||
import { createClassFromSpec } from "react-vega";
|
||||
import * as percentilesSpec from "../vega-specs/spec-percentiles.json";
|
||||
import { DistributionChart } from "./DistributionChart";
|
||||
import { Error } from "./Error";
|
||||
import { ErrorBox } from "./ErrorBox";
|
||||
|
||||
let SquigglePercentilesChart = createClassFromSpec({
|
||||
spec: percentilesSpec as Spec,
|
||||
});
|
||||
|
||||
type distPlusFn = (
|
||||
a: number
|
||||
) => result<Distribution, errorValue>
|
||||
type distPlusFn = (a: number) => result<Distribution, errorValue>;
|
||||
|
||||
const _rangeByCount = (start: number, stop: number, count: number) => {
|
||||
const step = (stop - start) / (count - 1);
|
||||
|
@ -24,9 +22,24 @@ const _rangeByCount = (start: number, stop: number, count: number) => {
|
|||
|
||||
function unwrap<a, b>(x: result<a, b>): a {
|
||||
if (x.tag === "Ok") {
|
||||
return x.value
|
||||
return x.value;
|
||||
} else {
|
||||
throw Error("FAILURE TO UNWRAP");
|
||||
}
|
||||
}
|
||||
|
||||
function mapFilter<a, b>(xs: a[], f: (x: a) => b | undefined): b[] {
|
||||
let initial: b[] = [];
|
||||
return xs.reduce((previous, current) => {
|
||||
let value: b | undefined = f(current);
|
||||
if (value !== undefined) {
|
||||
return previous.concat([value]);
|
||||
} else {
|
||||
return previous;
|
||||
}
|
||||
}, initial);
|
||||
}
|
||||
|
||||
export const FunctionChart: React.FC<{
|
||||
distPlusFn: distPlusFn;
|
||||
diagramStart: number;
|
||||
|
@ -44,46 +57,45 @@ export const FunctionChart: React.FC<{
|
|||
let mouseItem = distPlusFn(mouseOverlay);
|
||||
let showChart =
|
||||
mouseItem.tag === "Ok" ? (
|
||||
<DistributionChart distribution={mouseItem.value} width={400} height={140} />
|
||||
<DistributionChart
|
||||
distribution={mouseItem.value}
|
||||
width={400}
|
||||
height={140}
|
||||
/>
|
||||
) : (
|
||||
<></>
|
||||
);
|
||||
let data1 = _rangeByCount(diagramStart, diagramStop, diagramCount);
|
||||
let valueData = data1
|
||||
.map((x) => {
|
||||
let valueData = mapFilter(data1, (x) => {
|
||||
let result = distPlusFn(x);
|
||||
if (result.tag === "Ok") {
|
||||
return { x: x, value: result.value };
|
||||
} else return null;
|
||||
})
|
||||
.filter((x) => x !== null)
|
||||
.map(({ x, value }) => {
|
||||
}
|
||||
}).map(({ x, value }) => {
|
||||
return {
|
||||
x: x,
|
||||
p1: unwrap(value.inv(0.01)),
|
||||
p5: unwrap(value.inv(0.05)),
|
||||
p10: unwrap(value.inv(0.12)),
|
||||
p20: unwrap(value.inv(0.20)),
|
||||
p30: unwrap(value.inv(0.30)),
|
||||
p40: unwrap(value.inv(0.40)),
|
||||
p50: unwrap(value.inv(0.50)),
|
||||
p60: unwrap(value.inv(0.60)),
|
||||
p70: unwrap(value.inv(0.70)),
|
||||
p80: unwrap(value.inv(0.80)),
|
||||
p90: unwrap(value.inv(0.90)),
|
||||
p20: unwrap(value.inv(0.2)),
|
||||
p30: unwrap(value.inv(0.3)),
|
||||
p40: unwrap(value.inv(0.4)),
|
||||
p50: unwrap(value.inv(0.5)),
|
||||
p60: unwrap(value.inv(0.6)),
|
||||
p70: unwrap(value.inv(0.7)),
|
||||
p80: unwrap(value.inv(0.8)),
|
||||
p90: unwrap(value.inv(0.9)),
|
||||
p95: unwrap(value.inv(0.95)),
|
||||
p99: unwrap(value.inv(0.99)),
|
||||
};
|
||||
});
|
||||
|
||||
let errorData = data1
|
||||
.map((x) => {
|
||||
let errorData = mapFilter(data1, (x) => {
|
||||
let result = distPlusFn(x);
|
||||
if (result.tag === "Error") {
|
||||
return { x: x, error: result.value };
|
||||
} else return null;
|
||||
})
|
||||
.filter((x) => x !== null);
|
||||
}
|
||||
});
|
||||
let error2 = _.groupBy(errorData, (x) => x.error);
|
||||
return (
|
||||
<>
|
||||
|
@ -94,11 +106,10 @@ export const FunctionChart: React.FC<{
|
|||
/>
|
||||
{showChart}
|
||||
{_.keysIn(error2).map((k) => (
|
||||
<Error heading={k}>
|
||||
<ErrorBox heading={k}>
|
||||
{`Values: [${error2[k].map((r) => r.x.toFixed(2)).join(",")}]`}
|
||||
</Error>
|
||||
</ErrorBox>
|
||||
))}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
|
@ -71,12 +71,12 @@ export function numberShow(number: number, precision = 2) {
|
|||
|
||||
export interface NumberShowerProps {
|
||||
number: number;
|
||||
precision?: number
|
||||
precision?: number;
|
||||
}
|
||||
|
||||
export let NumberShower: React.FC<NumberShowerProps> = ({
|
||||
number,
|
||||
precision = 2
|
||||
precision = 2,
|
||||
}: NumberShowerProps) => {
|
||||
let numberWithPresentation = numberShow(number, precision);
|
||||
return (
|
||||
|
@ -95,4 +95,4 @@ export let NumberShower: React.FC<NumberShowerProps> = ({
|
|||
)}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
import * as React from "react";
|
||||
import _ from "lodash";
|
||||
import { run, errorValueToString } from "@quri/squiggle-lang";
|
||||
import type {
|
||||
samplingParams,
|
||||
exportEnv,
|
||||
} from "@quri/squiggle-lang";
|
||||
import type { samplingParams, exportEnv } from "@quri/squiggle-lang";
|
||||
import { NumberShower } from "./NumberShower";
|
||||
import { DistributionChart } from "./DistributionChart";
|
||||
import { Error } from "./Error";
|
||||
import { ErrorBox } from "./ErrorBox";
|
||||
|
||||
export interface SquiggleChartProps {
|
||||
/** The input string for squiggle */
|
||||
|
@ -37,9 +34,6 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = ({
|
|||
squiggleString = "",
|
||||
sampleCount = 1000,
|
||||
outputXYPoints = 1000,
|
||||
diagramStart = 0,
|
||||
diagramStop = 10,
|
||||
diagramCount = 20,
|
||||
environment = [],
|
||||
onEnvChange = () => {},
|
||||
width = 500,
|
||||
|
@ -47,18 +41,16 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = ({
|
|||
}: SquiggleChartProps) => {
|
||||
let samplingInputs: samplingParams = {
|
||||
sampleCount: sampleCount,
|
||||
xyPointLength: outputXYPoints
|
||||
xyPointLength: outputXYPoints,
|
||||
};
|
||||
|
||||
let result = run(squiggleString, samplingInputs, environment);
|
||||
console.log(result)
|
||||
if (result.tag === "Ok") {
|
||||
onEnvChange(environment);
|
||||
let chartResult = result.value;
|
||||
if (chartResult.tag === "number") {
|
||||
return <NumberShower precision={3} number={chartResult.value} />;
|
||||
} else if (chartResult.tag === "distribution") {
|
||||
console.log("Is a distribution")
|
||||
return (
|
||||
<DistributionChart
|
||||
distribution={chartResult.value}
|
||||
|
@ -66,14 +58,19 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = ({
|
|||
width={width}
|
||||
/>
|
||||
);
|
||||
console.log("NOT THIS LINE")
|
||||
} else {
|
||||
return (
|
||||
<ErrorBox heading="No Viewer">
|
||||
{"We don't currently have a viewer for this type: " + chartResult.tag}
|
||||
</ErrorBox>
|
||||
);
|
||||
}
|
||||
else {
|
||||
console.log("Is a distribution")
|
||||
return <Error heading="No Viewer">{"We don't currently have a viewer for this type: " + chartResult.tag}</Error>;
|
||||
}
|
||||
} else if (result.tag === "Error") {
|
||||
} else {
|
||||
// At this point, we came across an error. What was our error?
|
||||
return <Error heading={"Parse Error"}>{errorValueToString(result.value)}</Error>;
|
||||
return (
|
||||
<ErrorBox heading={"Parse Error"}>
|
||||
{errorValueToString(result.value)}
|
||||
</ErrorBox>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -3,7 +3,7 @@ import * as ReactDOM from "react-dom";
|
|||
import { SquiggleChart } from "./SquiggleChart";
|
||||
import { CodeEditor } from "./CodeEditor";
|
||||
import type { exportEnv } from "@quri/squiggle-lang";
|
||||
import styled from 'styled-components'
|
||||
import styled from "styled-components";
|
||||
|
||||
export interface SquiggleEditorProps {
|
||||
/** The input string for squiggle */
|
||||
|
|
|
@ -37,9 +37,7 @@ interface Props {
|
|||
}
|
||||
|
||||
let SquigglePlayground: FC<Props> = ({ initialSquiggleString = "" }: Props) => {
|
||||
let [squiggleString, setSquiggleString] = useState(
|
||||
initialSquiggleString
|
||||
);
|
||||
let [squiggleString, setSquiggleString] = useState(initialSquiggleString);
|
||||
let [sampleCount, setSampleCount] = useState(1000);
|
||||
let [outputXYPoints, setOutputXYPoints] = useState(1000);
|
||||
let [pointDistLength, setPointDistLength] = useState(1000);
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
export { SquiggleChart } from "./components/SquiggleChart";
|
||||
export { SquiggleEditor, renderSquiggleEditorToDom } from "./components/SquiggleEditor";
|
||||
export {
|
||||
SquiggleEditor,
|
||||
renderSquiggleEditorToDom,
|
||||
} from "./components/SquiggleEditor";
|
||||
import SquigglePlayground, {
|
||||
renderSquigglePlaygroundToDom,
|
||||
} from "./components/SquigglePlayground";
|
||||
|
|
|
@ -14,10 +14,10 @@ It uses the symbols "K", "M", "B", and "T", to represent thousands, millions, bi
|
|||
name="Ten Thousand"
|
||||
args={{
|
||||
number: 10000,
|
||||
precision: 2
|
||||
precision: 2,
|
||||
}}
|
||||
>
|
||||
{args => <NumberShower {...args}/>}
|
||||
{(args) => <NumberShower {...args} />}
|
||||
</Story>
|
||||
</Canvas>
|
||||
|
||||
|
@ -26,10 +26,10 @@ It uses the symbols "K", "M", "B", and "T", to represent thousands, millions, bi
|
|||
name="Ten Billion"
|
||||
args={{
|
||||
number: 10000000000,
|
||||
precision: 2
|
||||
precision: 2,
|
||||
}}
|
||||
>
|
||||
{args => <NumberShower {...args}/>}
|
||||
{(args) => <NumberShower {...args} />}
|
||||
</Story>
|
||||
</Canvas>
|
||||
|
||||
|
@ -38,10 +38,10 @@ It uses the symbols "K", "M", "B", and "T", to represent thousands, millions, bi
|
|||
name="1.2*10^15"
|
||||
args={{
|
||||
number: 1200000000000000,
|
||||
precision: 2
|
||||
precision: 2,
|
||||
}}
|
||||
>
|
||||
{args => <NumberShower {...args}/>}
|
||||
{(args) => <NumberShower {...args} />}
|
||||
</Story>
|
||||
</Canvas>
|
||||
|
||||
|
@ -50,10 +50,10 @@ It uses the symbols "K", "M", "B", and "T", to represent thousands, millions, bi
|
|||
name="1.35*10^-13"
|
||||
args={{
|
||||
number: 0.000000000000135,
|
||||
precision: 2
|
||||
precision: 2,
|
||||
}}
|
||||
>
|
||||
{args => <NumberShower {...args}/>}
|
||||
{(args) => <NumberShower {...args} />}
|
||||
</Story>
|
||||
</Canvas>
|
||||
|
||||
|
|
|
@ -50,7 +50,8 @@ could be continuous, discrete or mixed.
|
|||
<Story
|
||||
name="Mixed"
|
||||
args={{
|
||||
squiggleString: "mm(0, 1, 3, 5, 8, normal(8, 1), [0.1, 0.3, 0.4, 0.35, 0.2, 0.8])",
|
||||
squiggleString:
|
||||
"mm(0, 1, 3, 5, 8, normal(8, 1), [0.1, 0.3, 0.4, 0.35, 0.2, 0.8])",
|
||||
}}
|
||||
>
|
||||
{Template.bind({})}
|
||||
|
|
|
@ -5,10 +5,12 @@
|
|||
},
|
||||
"module": "commonjs",
|
||||
"jsx": "react",
|
||||
"skipLibCheck": true,
|
||||
"resolveJsonModule": true,
|
||||
"noImplicitAny": false,
|
||||
"esModuleInterop": true,
|
||||
"removeComments": true,
|
||||
"strict": true,
|
||||
"preserveConstEnums": true,
|
||||
"composite": true,
|
||||
"outDir": "./dist",
|
||||
|
@ -16,7 +18,10 @@
|
|||
"declaration": true,
|
||||
"sourceMap": true
|
||||
},
|
||||
"files": ["src/vega-specs/spec-distributions.json", "src/vega-specs/spec-percentiles.json"],
|
||||
"files": [
|
||||
"src/vega-specs/spec-distributions.json",
|
||||
"src/vega-specs/spec-percentiles.json"
|
||||
],
|
||||
"target": "ES6",
|
||||
"include": ["src/**/*", "src/*"],
|
||||
"exclude": ["node_modules", "**/*.spec.ts", "webpack.config.js"],
|
||||
|
|
|
@ -3,13 +3,15 @@ const path = require("path");
|
|||
module.exports = {
|
||||
mode: "production",
|
||||
devtool: "source-map",
|
||||
profile: true,
|
||||
entry: "./src/index.ts",
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
loader: "ts-loader",
|
||||
options: { projectReferences: true },
|
||||
include: path.resolve(__dirname, "src"),
|
||||
options: { projectReferences: true, transpileOnly: true },
|
||||
exclude: /node_modules/,
|
||||
},
|
||||
{
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
*.bs.js
|
||||
*.gen.tsx
|
||||
dist
|
|
@ -1,10 +1,15 @@
|
|||
import { run, Distribution, resultMap, squiggleExpression } from "../src/js/index";
|
||||
import {
|
||||
run,
|
||||
Distribution,
|
||||
resultMap,
|
||||
squiggleExpression,
|
||||
} from "../src/js/index";
|
||||
|
||||
let testRun = (x: string): squiggleExpression => {
|
||||
let result = run(x, { sampleCount: 100, xyPointLength: 100 });
|
||||
expect(result.tag).toEqual("Ok")
|
||||
expect(result.tag).toEqual("Ok");
|
||||
if (result.tag === "Ok") {
|
||||
return result.value
|
||||
return result.value;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -16,7 +21,7 @@ describe("Simple calculations and results", () => {
|
|||
test("mean(normal(5,2))", () => {
|
||||
expect(testRun("mean(normal(5,2))")).toEqual({
|
||||
tag: "number",
|
||||
value: 5
|
||||
value: 5,
|
||||
});
|
||||
});
|
||||
test("10+10", () => {
|
||||
|
|
|
@ -1,11 +1,26 @@
|
|||
import * as _ from 'lodash'
|
||||
import * as _ from "lodash";
|
||||
import type {
|
||||
exportEnv,
|
||||
exportDistribution,
|
||||
} from "../rescript/ProgramEvaluator.gen";
|
||||
export type { exportEnv, exportDistribution };
|
||||
import { genericDist, samplingParams, evaluate, expressionValue, errorValue, distributionError, toPointSet, continuousShape, discreteShape, distributionErrorToString } from "../rescript/TypescriptInterface.gen";
|
||||
export { makeSampleSetDist, errorValueToString, distributionErrorToString } from "../rescript/TypescriptInterface.gen";
|
||||
import {
|
||||
genericDist,
|
||||
samplingParams,
|
||||
evaluate,
|
||||
expressionValue,
|
||||
errorValue,
|
||||
distributionError,
|
||||
toPointSet,
|
||||
continuousShape,
|
||||
discreteShape,
|
||||
distributionErrorToString,
|
||||
} from "../rescript/TypescriptInterface.gen";
|
||||
export {
|
||||
makeSampleSetDist,
|
||||
errorValueToString,
|
||||
distributionErrorToString,
|
||||
} from "../rescript/TypescriptInterface.gen";
|
||||
import {
|
||||
Constructors_mean,
|
||||
Constructors_sample,
|
||||
|
@ -32,11 +47,11 @@ import {
|
|||
Constructors_pointwiseLogarithm,
|
||||
Constructors_pointwisePower,
|
||||
} from "../rescript/Distributions/DistributionOperation/DistributionOperation.gen";
|
||||
export type {samplingParams, errorValue}
|
||||
export type { samplingParams, errorValue };
|
||||
|
||||
export let defaultSamplingInputs: samplingParams = {
|
||||
sampleCount: 10000,
|
||||
xyPointLength: 10000
|
||||
xyPointLength: 10000,
|
||||
};
|
||||
|
||||
export type result<a, b> =
|
||||
|
@ -61,16 +76,23 @@ export function resultMap<a, b, c>(
|
|||
}
|
||||
|
||||
function Ok<a, b>(x: a): result<a, b> {
|
||||
return {"tag": "Ok", value: x}
|
||||
return { tag: "Ok", value: x };
|
||||
}
|
||||
|
||||
type tagged<a, b> = {tag: a, value: b}
|
||||
type tagged<a, b> = { tag: a; value: b };
|
||||
|
||||
function tag<a, b>(x: a, y: b): tagged<a, b> {
|
||||
return { tag: x, value: y}
|
||||
return { tag: x, value: y };
|
||||
}
|
||||
|
||||
export type squiggleExpression = tagged<"symbol", string> | tagged<"string", string> | tagged<"array", squiggleExpression[]> | tagged<"boolean", boolean> | tagged<"distribution", Distribution> | tagged<"number", number> | tagged<"record", {[key: string]: squiggleExpression }>
|
||||
export type squiggleExpression =
|
||||
| tagged<"symbol", string>
|
||||
| tagged<"string", string>
|
||||
| tagged<"array", squiggleExpression[]>
|
||||
| tagged<"boolean", boolean>
|
||||
| tagged<"distribution", Distribution>
|
||||
| tagged<"number", number>
|
||||
| tagged<"record", { [key: string]: squiggleExpression }>;
|
||||
export function run(
|
||||
squiggleString: string,
|
||||
samplingInputs?: samplingParams,
|
||||
|
@ -80,14 +102,19 @@ export function run(
|
|||
? samplingInputs
|
||||
: defaultSamplingInputs;
|
||||
let result: result<expressionValue, errorValue> = evaluate(squiggleString);
|
||||
return resultMap(result, x => createTsExport(x, si));
|
||||
return resultMap(result, (x) => createTsExport(x, si));
|
||||
}
|
||||
|
||||
|
||||
function createTsExport(x: expressionValue, sampEnv: samplingParams): squiggleExpression {
|
||||
function createTsExport(
|
||||
x: expressionValue,
|
||||
sampEnv: samplingParams
|
||||
): squiggleExpression {
|
||||
switch (x.tag) {
|
||||
case "EvArray":
|
||||
return tag("array", x.value.map(x => createTsExport(x, sampEnv)));
|
||||
return tag(
|
||||
"array",
|
||||
x.value.map((x) => createTsExport(x, sampEnv))
|
||||
);
|
||||
case "EvBool":
|
||||
return tag("boolean", x.value);
|
||||
case "EvDistribution":
|
||||
|
@ -95,26 +122,32 @@ function createTsExport(x: expressionValue, sampEnv: samplingParams): squiggleEx
|
|||
case "EvNumber":
|
||||
return tag("number", x.value);
|
||||
case "EvRecord":
|
||||
return tag("record", _.mapValues(x.value, x => createTsExport(x, sampEnv)))
|
||||
return tag(
|
||||
"record",
|
||||
_.mapValues(x.value, (x) => createTsExport(x, sampEnv))
|
||||
);
|
||||
case "EvString":
|
||||
return tag("string", x.value);
|
||||
case "EvSymbol":
|
||||
return tag("symbol", x.value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export function resultExn<a, c>(r: result<a, c>): a | c {
|
||||
return r.value;
|
||||
}
|
||||
|
||||
export type point = { x: number, y: number}
|
||||
export type point = { x: number; y: number };
|
||||
|
||||
export type shape = {
|
||||
continuous: point[]
|
||||
discrete: point[]
|
||||
}
|
||||
continuous: point[];
|
||||
discrete: point[];
|
||||
};
|
||||
|
||||
function shapePoints(x: continuousShape | discreteShape): point[] {
|
||||
let xs = x.xyShape.xs;
|
||||
let ys = x.xyShape.ys;
|
||||
return _.zipWith(xs, ys, (x, y) => ({x, y}))
|
||||
return _.zipWith(xs, ys, (x, y) => ({ x, y }));
|
||||
}
|
||||
|
||||
export class Distribution {
|
||||
|
@ -127,7 +160,9 @@ export class Distribution {
|
|||
return this;
|
||||
}
|
||||
|
||||
mapResultDist(r: result<genericDist, distributionError>): result<Distribution, distributionError> {
|
||||
mapResultDist(
|
||||
r: result<genericDist, distributionError>
|
||||
): result<Distribution, distributionError> {
|
||||
return resultMap(r, (v: genericDist) => new Distribution(v, this.env));
|
||||
}
|
||||
|
||||
|
@ -158,30 +193,34 @@ export class Distribution {
|
|||
}
|
||||
|
||||
shape(): result<shape, distributionError> {
|
||||
let pointSet = toPointSet(this.t, {xyPointLength: this.env.xyPointLength, sampleCount: this.env.sampleCount}, null);
|
||||
let pointSet = toPointSet(
|
||||
this.t,
|
||||
{
|
||||
xyPointLength: this.env.xyPointLength,
|
||||
sampleCount: this.env.sampleCount,
|
||||
},
|
||||
undefined
|
||||
);
|
||||
if (pointSet.tag === "Ok") {
|
||||
let distribution = pointSet.value;
|
||||
if (distribution.tag === "Continuous") {
|
||||
return Ok({
|
||||
continuous: shapePoints(distribution.value),
|
||||
discrete: []
|
||||
})
|
||||
}
|
||||
else if(distribution.tag === "Discrete"){
|
||||
discrete: [],
|
||||
});
|
||||
} else if (distribution.tag === "Discrete") {
|
||||
return Ok({
|
||||
discrete: shapePoints(distribution.value),
|
||||
continuous: []
|
||||
})
|
||||
}
|
||||
else if(distribution.tag === "Mixed"){
|
||||
continuous: [],
|
||||
});
|
||||
} else {
|
||||
return Ok({
|
||||
discrete: shapePoints(distribution.value.discrete),
|
||||
continuous: shapePoints(distribution.value.continuous)
|
||||
})
|
||||
continuous: shapePoints(distribution.value.continuous),
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
return pointSet
|
||||
} else {
|
||||
return pointSet;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -197,7 +236,10 @@ export class Distribution {
|
|||
);
|
||||
}
|
||||
|
||||
truncate(left: number, right: number): result<Distribution, distributionError> {
|
||||
truncate(
|
||||
left: number,
|
||||
right: number
|
||||
): result<Distribution, distributionError> {
|
||||
return this.mapResultDist(
|
||||
Constructors_truncate({ env: this.env }, this.t, left, right)
|
||||
);
|
||||
|
@ -210,10 +252,9 @@ export class Distribution {
|
|||
toString(): string {
|
||||
let result = Constructors_toString({ env: this.env }, this.t);
|
||||
if (result.tag === "Ok") {
|
||||
return result.value
|
||||
}
|
||||
else {
|
||||
return distributionErrorToString(result.value)
|
||||
return result.value;
|
||||
} else {
|
||||
return distributionErrorToString(result.value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -245,7 +286,9 @@ export class Distribution {
|
|||
);
|
||||
}
|
||||
|
||||
algebraicLogarithm(d2: Distribution): result<Distribution, distributionError> {
|
||||
algebraicLogarithm(
|
||||
d2: Distribution
|
||||
): result<Distribution, distributionError> {
|
||||
return this.mapResultDist(
|
||||
Constructors_algebraicLogarithm({ env: this.env }, this.t, d2.t)
|
||||
);
|
||||
|
@ -281,7 +324,9 @@ export class Distribution {
|
|||
);
|
||||
}
|
||||
|
||||
pointwiseLogarithm(d2: Distribution): result<Distribution, distributionError> {
|
||||
pointwiseLogarithm(
|
||||
d2: Distribution
|
||||
): result<Distribution, distributionError> {
|
||||
return this.mapResultDist(
|
||||
Constructors_pointwiseLogarithm({ env: this.env }, this.t, d2.t)
|
||||
);
|
||||
|
|
|
@ -1 +1 @@
|
|||
export type Dict_t<T> = { [key: string]: T }
|
||||
export type Dict_t<T> = { [key: string]: T };
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
"removeComments": true,
|
||||
"preserveConstEnums": true,
|
||||
"sourceMap": true,
|
||||
"strict": true,
|
||||
"outDir": "./dist",
|
||||
"declarationDir": "./dist",
|
||||
"declaration": true,
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
.docusaurus
|
33
yarn.lock
33
yarn.lock
|
@ -4025,28 +4025,10 @@
|
|||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react@*":
|
||||
version "17.0.44"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.44.tgz#c3714bd34dd551ab20b8015d9d0dbec812a51ec7"
|
||||
integrity sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==
|
||||
dependencies:
|
||||
"@types/prop-types" "*"
|
||||
"@types/scheduler" "*"
|
||||
csstype "^3.0.2"
|
||||
|
||||
"@types/react@^16.9.19":
|
||||
version "16.14.24"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.24.tgz#f2c5e9fa78f83f769884b83defcf7924b9eb5c82"
|
||||
integrity sha512-e7U2WC8XQP/xfR7bwhOhNFZKPTfW1ph+MiqtudKb8tSV8RyCsovQx2sNVtKoOryjxFKpHPPC/yNiGfdeVM5Gyw==
|
||||
dependencies:
|
||||
"@types/prop-types" "*"
|
||||
"@types/scheduler" "*"
|
||||
csstype "^3.0.2"
|
||||
|
||||
"@types/react@^18.0.1":
|
||||
version "18.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.1.tgz#1b2e02fb7613212518733946e49fb963dfc66e19"
|
||||
integrity sha512-VnWlrVgG0dYt+NqlfMI0yUYb8Rdl4XUROyH+c6gq/iFCiZ805Vi//26UW38DHnxQkbDhnrIWTBiy6oKZqL11cw==
|
||||
"@types/react@*", "@types/react@17.0.43", "@types/react@^16.9.19", "@types/react@^18.0.1":
|
||||
version "17.0.43"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.43.tgz#4adc142887dd4a2601ce730bc56c3436fdb07a55"
|
||||
integrity sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==
|
||||
dependencies:
|
||||
"@types/prop-types" "*"
|
||||
"@types/scheduler" "*"
|
||||
|
@ -15495,6 +15477,13 @@ spdy@^4.0.2:
|
|||
select-hose "^2.0.0"
|
||||
spdy-transport "^3.0.0"
|
||||
|
||||
speed-measure-webpack-plugin@^1.5.0:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.5.0.tgz#caf2c5bee24ab66c1c7c30e8daa7910497f7681a"
|
||||
integrity sha512-Re0wX5CtM6gW7bZA64ONOfEPEhwbiSF/vz6e2GvadjuaPrQcHTQdRGsD8+BE7iUOysXH8tIenkPCQBEcspXsNg==
|
||||
dependencies:
|
||||
chalk "^4.1.0"
|
||||
|
||||
split-string@^3.0.1, split-string@^3.0.2:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
|
||||
|
|
Loading…
Reference in New Issue
Block a user