Run prettier on monorepo + fix crashing playground

This commit is contained in:
Sam Nolan 2022-04-12 15:41:36 +10:00
parent 26433c5289
commit 440bfabffa
36 changed files with 452 additions and 388 deletions

View File

@ -1,14 +1,13 @@
--- ---
name: Developer friction when contributing to Squiggle 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. 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: # Description:
# The OS and version, yarn version, etc. in which this came up # The OS and version, yarn version, etc. in which this came up
_delete this section if testing task_ _delete this section if testing task_
# Desired behavior # Desired behavior

View File

@ -2,6 +2,5 @@
name: Idea or feature request name: Idea or feature request
about: Where would you like to see Squiggle go over the next few months, several months, or few years? about: Where would you like to see Squiggle go over the next few months, several months, or few years?
--- ---
# Description # Description

View File

@ -1,14 +1,13 @@
--- ---
name: Regarding the programming language name: Regarding the programming language
about: Interpreter, parser, syntax, semantics, and including distributions about: Interpreter, parser, syntax, semantics, and including distributions
labels: 'programming language' labels: "programming language"
--- ---
<!-- mark one with an x --> <!-- mark one with an x -->
- _ Is refactor
- _ Is new feature - \_ Is refactor
- _ Concerns documentation - \_ Is new feature
- \_ Concerns documentation
# Description of suggestion or shortcoming: # Description of suggestion or shortcoming:

View File

@ -1,18 +1,17 @@
--- ---
name: Bug reports for Squiggle users name: Bug reports for Squiggle users
about: Rendering oddly, trouble with the playground, something like this? about: Rendering oddly, trouble with the playground, something like this?
labels: 'bug' labels: "bug"
--- ---
# Description: # Description:
# Steps to reproduce: # Steps to reproduce:
1. 1.
2. 2.
3. 3.
# Expected behavior: # Expected behavior:
# What I got instead: # What I got instead:

View File

@ -8,7 +8,6 @@ on:
- staging - staging
jobs: jobs:
pre_check: pre_check:
name: Precheck for skipping redundant jobs name: Precheck for skipping redundant jobs
runs-on: ubuntu-latest runs-on: ubuntu-latest

View File

@ -22,7 +22,7 @@ on:
- master - master
- staging - staging
schedule: schedule:
- cron: '42 19 * * 0' - cron: "42 19 * * 0"
jobs: jobs:
analyze: analyze:
@ -36,7 +36,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
language: [ 'javascript' ] language: ["javascript"]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support # Learn more about CodeQL language support at https://git.io/codeql-language-support

9
.prettierignore Normal file
View 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

View File

@ -21,6 +21,7 @@ Anyone (with a github account) can file an issue at any time. Please allow Quinn
# Project structure # Project structure
Squiggle is a **monorepo** with four **packages**. Squiggle is a **monorepo** with four **packages**.
- **components** is where we improve reactive interfacing with Squiggle - **components** is where we improve reactive interfacing with Squiggle
- **playground** is the site `playground.squiggle-language.com` - **playground** is the site `playground.squiggle-language.com`
- **squiggle-lang** is where the magic happens: probability distributions, the interpreter, etc. - **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 ## 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`. You'll need to run a command like this in order to get `yarn build` to run, especially in `packages/squiggle-lang`.
```sh ```sh
patchelf --set-interpreter $(patchelf --print-interpreter $(which mkdir)) ./node_modules/gentype/gentype.exe patchelf --set-interpreter $(patchelf --print-interpreter $(which mkdir)) ./node_modules/gentype/gentype.exe
``` ```

View File

@ -1,4 +1,5 @@
# Squiggle # Squiggle
![Packages check](https://github.com/QURIresearch/squiggle/actions/workflows/ci.yaml/badge.svg) ![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-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) [![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 - **old playground**: https://playground.squiggle-language.com
## Packages ## Packages
This monorepo has several packages that can be used for various purposes. All This monorepo has several packages that can be used for various purposes. All
the packages can be found in `packages`. the packages can be found in `packages`.
@ -48,4 +50,5 @@ codium
The `nix develop` shell also provides `yarn`. The `nix develop` shell also provides `yarn`.
# Contributing # Contributing
See `CONTRIBUTING.md`. See `CONTRIBUTING.md`.

View File

@ -8,7 +8,8 @@
"packages/*" "packages/*"
], ],
"resolutions": { "resolutions": {
"@types/react": "^17.0.43" "@types/react": "^18.0.1",
"react": "^18.0.0"
}, },
"packageManager": "yarn@1.22.17" "packageManager": "yarn@1.22.17"
} }

View File

@ -1,5 +0,0 @@
dist
build
node_modules
storybook-static
.storybook

View File

@ -1,31 +1,37 @@
//const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin'); //const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
const custom = require('../webpack.config.js'); const custom = require("../webpack.config.js");
module.exports = { module.exports = {
webpackFinal: async (config) => { webpackFinal: async (config) => {
config.resolve.alias = custom.resolve.alias; 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)" stories: ["../src/**/*.stories.mdx", "../src/**/*.stories.@(js|jsx|ts|tsx)"],
], addons: [
"addons": [
"@storybook/addon-links", "@storybook/addon-links",
"@storybook/addon-essentials", "@storybook/addon-essentials",
"@storybook/preset-create-react-app" "@storybook/preset-create-react-app",
], ],
"framework": "@storybook/react", framework: "@storybook/react",
"core": { core: {
"builder": "webpack5" builder: "webpack5",
}, },
typescript: { typescript: {
check: false, check: false,
checkOptions: {}, checkOptions: {},
reactDocgen: 'react-docgen-typescript', reactDocgen: "react-docgen-typescript",
reactDocgenTypescriptOptions: { reactDocgenTypescriptOptions: {
shouldExtractLiteralValuesFromEnum: true, shouldExtractLiteralValuesFromEnum: true,
propFilter: (prop) => (prop.parent ? !/node_modules/.test(prop.parent.fileName) : true), propFilter: (prop) =>
prop.parent ? !/node_modules/.test(prop.parent.fileName) : true,
}, },
}, },
} };

View File

@ -6,4 +6,4 @@ export const parameters = {
date: /Date$/, date: /Date$/,
}, },
}, },
} };

View File

@ -15,10 +15,10 @@
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"react": "^18.0.0", "react": "^18.0.0",
"react-ace": "9.5.0",
"react-dom": "^18.0.0", "react-dom": "^18.0.0",
"react-scripts": "5.0.0", "react-scripts": "5.0.0",
"react-vega": "^7.5.0", "react-vega": "^7.5.0",
"react-ace": "9.5.0",
"styled-components": "^5.3.5", "styled-components": "^5.3.5",
"tsconfig-paths-webpack-plugin": "^3.5.2", "tsconfig-paths-webpack-plugin": "^3.5.2",
"typescript": "^4.6.3", "typescript": "^4.6.3",
@ -63,9 +63,6 @@
] ]
}, },
"devDependencies": { "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", "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
"@storybook/addon-actions": "^6.4.20", "@storybook/addon-actions": "^6.4.20",
"@storybook/addon-essentials": "^6.4.20", "@storybook/addon-essentials": "^6.4.20",
@ -75,9 +72,13 @@
"@storybook/node-logger": "^6.4.20", "@storybook/node-logger": "^6.4.20",
"@storybook/preset-create-react-app": "^4.1.0", "@storybook/preset-create-react-app": "^4.1.0",
"@storybook/react": "^6.4.20", "@storybook/react": "^6.4.20",
"@types/styled-components": "^5.1.24",
"@types/webpack": "^4.41.32", "@types/webpack": "^4.41.32",
"css-loader": "^6.7.1",
"prettier": "^2.6.2", "prettier": "^2.6.2",
"react-codejar": "^1.1.2", "react-codejar": "^1.1.2",
"speed-measure-webpack-plugin": "^1.5.0",
"style-loader": "^3.3.1",
"ts-loader": "^9.2.8", "ts-loader": "^9.2.8",
"webpack": "^5.72.0", "webpack": "^5.72.0",
"webpack-cli": "^4.9.2", "webpack-cli": "^4.9.2",

View File

@ -1,10 +1,8 @@
import * as React from "react"; import * as React from "react";
import _ from "lodash"; import _ from "lodash";
import type { Spec } from "vega"; import type { Spec } from "vega";
import type { import type { Distribution } from "@quri/squiggle-lang";
Distribution, import { distributionErrorToString } from "@quri/squiggle-lang";
} from "@quri/squiggle-lang";
import { distributionErrorToString } from '@quri/squiggle-lang';
import { createClassFromSpec } from "react-vega"; import { createClassFromSpec } from "react-vega";
import * as chartSpecification from "../vega-specs/spec-distributions.json"; import * as chartSpecification from "../vega-specs/spec-distributions.json";
@ -16,12 +14,14 @@ type DistributionChartProps = {
distribution: Distribution; distribution: Distribution;
width: number; width: number;
height: number; height: number;
} };
export const DistributionChart: React.FC<DistributionChartProps> = ({ distribution, width, height }: DistributionChartProps) => { export const DistributionChart: React.FC<DistributionChartProps> = ({
console.log("Making shape") distribution,
width,
height,
}: DistributionChartProps) => {
let shape = distribution.shape(); let shape = distribution.shape();
console.log(shape)
if (shape.tag === "Ok") { if (shape.tag === "Ok") {
return ( return (
<SquiggleVegaChart <SquiggleVegaChart
@ -31,8 +31,7 @@ export const DistributionChart: React.FC<DistributionChartProps> = ({ distributi
actions={false} actions={false}
/> />
); );
} } else {
else{
return <> {distributionErrorToString(shape.value)} </>; return <> {distributionErrorToString(shape.value)} </>;
} }
}; };

View File

@ -7,10 +7,10 @@ const ShowError = styled.div`
padding: 0.4em 0.8em; padding: 0.4em 0.8em;
`; `;
export const Error: React.FC<{ heading: string; children: React.ReactNode }> = ({ export const ErrorBox: React.FC<{
heading = "Error", heading: string;
children, children: React.ReactNode;
}) => { }> = ({ heading = "Error", children }) => {
return ( return (
<ShowError> <ShowError>
<h3>{heading}</h3> <h3>{heading}</h3>

View File

@ -5,15 +5,13 @@ import type { Distribution, errorValue, result } from "@quri/squiggle-lang";
import { createClassFromSpec } from "react-vega"; import { createClassFromSpec } from "react-vega";
import * as percentilesSpec from "../vega-specs/spec-percentiles.json"; import * as percentilesSpec from "../vega-specs/spec-percentiles.json";
import { DistributionChart } from "./DistributionChart"; import { DistributionChart } from "./DistributionChart";
import { Error } from "./Error"; import { ErrorBox } from "./ErrorBox";
let SquigglePercentilesChart = createClassFromSpec({ let SquigglePercentilesChart = createClassFromSpec({
spec: percentilesSpec as Spec, spec: percentilesSpec as Spec,
}); });
type distPlusFn = ( type distPlusFn = (a: number) => result<Distribution, errorValue>;
a: number
) => result<Distribution, errorValue>
const _rangeByCount = (start: number, stop: number, count: number) => { const _rangeByCount = (start: number, stop: number, count: number) => {
const step = (stop - start) / (count - 1); 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 { function unwrap<a, b>(x: result<a, b>): a {
if (x.tag === "Ok") { 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<{ export const FunctionChart: React.FC<{
distPlusFn: distPlusFn; distPlusFn: distPlusFn;
diagramStart: number; diagramStart: number;
@ -44,46 +57,45 @@ export const FunctionChart: React.FC<{
let mouseItem = distPlusFn(mouseOverlay); let mouseItem = distPlusFn(mouseOverlay);
let showChart = let showChart =
mouseItem.tag === "Ok" ? ( 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 data1 = _rangeByCount(diagramStart, diagramStop, diagramCount);
let valueData = data1 let valueData = mapFilter(data1, (x) => {
.map((x) => {
let result = distPlusFn(x); let result = distPlusFn(x);
if (result.tag === "Ok") { if (result.tag === "Ok") {
return { x: x, value: result.value }; return { x: x, value: result.value };
} else return null; }
}) }).map(({ x, value }) => {
.filter((x) => x !== null)
.map(({ x, value }) => {
return { return {
x: x, x: x,
p1: unwrap(value.inv(0.01)), p1: unwrap(value.inv(0.01)),
p5: unwrap(value.inv(0.05)), p5: unwrap(value.inv(0.05)),
p10: unwrap(value.inv(0.12)), p10: unwrap(value.inv(0.12)),
p20: unwrap(value.inv(0.20)), p20: unwrap(value.inv(0.2)),
p30: unwrap(value.inv(0.30)), p30: unwrap(value.inv(0.3)),
p40: unwrap(value.inv(0.40)), p40: unwrap(value.inv(0.4)),
p50: unwrap(value.inv(0.50)), p50: unwrap(value.inv(0.5)),
p60: unwrap(value.inv(0.60)), p60: unwrap(value.inv(0.6)),
p70: unwrap(value.inv(0.70)), p70: unwrap(value.inv(0.7)),
p80: unwrap(value.inv(0.80)), p80: unwrap(value.inv(0.8)),
p90: unwrap(value.inv(0.90)), p90: unwrap(value.inv(0.9)),
p95: unwrap(value.inv(0.95)), p95: unwrap(value.inv(0.95)),
p99: unwrap(value.inv(0.99)), p99: unwrap(value.inv(0.99)),
}; };
}); });
let errorData = data1 let errorData = mapFilter(data1, (x) => {
.map((x) => {
let result = distPlusFn(x); let result = distPlusFn(x);
if (result.tag === "Error") { if (result.tag === "Error") {
return { x: x, error: result.value }; return { x: x, error: result.value };
} else return null; }
}) });
.filter((x) => x !== null);
let error2 = _.groupBy(errorData, (x) => x.error); let error2 = _.groupBy(errorData, (x) => x.error);
return ( return (
<> <>
@ -94,11 +106,10 @@ export const FunctionChart: React.FC<{
/> />
{showChart} {showChart}
{_.keysIn(error2).map((k) => ( {_.keysIn(error2).map((k) => (
<Error heading={k}> <ErrorBox heading={k}>
{`Values: [${error2[k].map((r) => r.x.toFixed(2)).join(",")}]`} {`Values: [${error2[k].map((r) => r.x.toFixed(2)).join(",")}]`}
</Error> </ErrorBox>
))} ))}
</> </>
); );
}; };

View File

@ -71,12 +71,12 @@ export function numberShow(number: number, precision = 2) {
export interface NumberShowerProps { export interface NumberShowerProps {
number: number; number: number;
precision?: number precision?: number;
} }
export let NumberShower: React.FC<NumberShowerProps> = ({ export let NumberShower: React.FC<NumberShowerProps> = ({
number, number,
precision = 2 precision = 2,
}: NumberShowerProps) => { }: NumberShowerProps) => {
let numberWithPresentation = numberShow(number, precision); let numberWithPresentation = numberShow(number, precision);
return ( return (
@ -95,4 +95,4 @@ export let NumberShower: React.FC<NumberShowerProps> = ({
)} )}
</span> </span>
); );
} };

View File

@ -1,13 +1,10 @@
import * as React from "react"; import * as React from "react";
import _ from "lodash"; import _ from "lodash";
import { run, errorValueToString } from "@quri/squiggle-lang"; import { run, errorValueToString } from "@quri/squiggle-lang";
import type { import type { samplingParams, exportEnv } from "@quri/squiggle-lang";
samplingParams,
exportEnv,
} from "@quri/squiggle-lang";
import { NumberShower } from "./NumberShower"; import { NumberShower } from "./NumberShower";
import { DistributionChart } from "./DistributionChart"; import { DistributionChart } from "./DistributionChart";
import { Error } from "./Error"; import { ErrorBox } from "./ErrorBox";
export interface SquiggleChartProps { export interface SquiggleChartProps {
/** The input string for squiggle */ /** The input string for squiggle */
@ -37,9 +34,6 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = ({
squiggleString = "", squiggleString = "",
sampleCount = 1000, sampleCount = 1000,
outputXYPoints = 1000, outputXYPoints = 1000,
diagramStart = 0,
diagramStop = 10,
diagramCount = 20,
environment = [], environment = [],
onEnvChange = () => {}, onEnvChange = () => {},
width = 500, width = 500,
@ -47,18 +41,16 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = ({
}: SquiggleChartProps) => { }: SquiggleChartProps) => {
let samplingInputs: samplingParams = { let samplingInputs: samplingParams = {
sampleCount: sampleCount, sampleCount: sampleCount,
xyPointLength: outputXYPoints xyPointLength: outputXYPoints,
}; };
let result = run(squiggleString, samplingInputs, environment); let result = run(squiggleString, samplingInputs, environment);
console.log(result)
if (result.tag === "Ok") { if (result.tag === "Ok") {
onEnvChange(environment); onEnvChange(environment);
let chartResult = result.value; let chartResult = result.value;
if (chartResult.tag === "number") { if (chartResult.tag === "number") {
return <NumberShower precision={3} number={chartResult.value} />; return <NumberShower precision={3} number={chartResult.value} />;
} else if (chartResult.tag === "distribution") { } else if (chartResult.tag === "distribution") {
console.log("Is a distribution")
return ( return (
<DistributionChart <DistributionChart
distribution={chartResult.value} distribution={chartResult.value}
@ -66,14 +58,19 @@ export const SquiggleChart: React.FC<SquiggleChartProps> = ({
width={width} 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 { } 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") {
// At this point, we came across an error. What was our error? // 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>
);
} }
}; };

View File

@ -3,7 +3,7 @@ import * as ReactDOM from "react-dom";
import { SquiggleChart } from "./SquiggleChart"; import { SquiggleChart } from "./SquiggleChart";
import { CodeEditor } from "./CodeEditor"; import { CodeEditor } from "./CodeEditor";
import type { exportEnv } from "@quri/squiggle-lang"; import type { exportEnv } from "@quri/squiggle-lang";
import styled from 'styled-components' import styled from "styled-components";
export interface SquiggleEditorProps { export interface SquiggleEditorProps {
/** The input string for squiggle */ /** The input string for squiggle */

View File

@ -37,9 +37,7 @@ interface Props {
} }
let SquigglePlayground: FC<Props> = ({ initialSquiggleString = "" }: Props) => { let SquigglePlayground: FC<Props> = ({ initialSquiggleString = "" }: Props) => {
let [squiggleString, setSquiggleString] = useState( let [squiggleString, setSquiggleString] = useState(initialSquiggleString);
initialSquiggleString
);
let [sampleCount, setSampleCount] = useState(1000); let [sampleCount, setSampleCount] = useState(1000);
let [outputXYPoints, setOutputXYPoints] = useState(1000); let [outputXYPoints, setOutputXYPoints] = useState(1000);
let [pointDistLength, setPointDistLength] = useState(1000); let [pointDistLength, setPointDistLength] = useState(1000);

View File

@ -1,5 +1,8 @@
export { SquiggleChart } from "./components/SquiggleChart"; export { SquiggleChart } from "./components/SquiggleChart";
export { SquiggleEditor, renderSquiggleEditorToDom } from "./components/SquiggleEditor"; export {
SquiggleEditor,
renderSquiggleEditorToDom,
} from "./components/SquiggleEditor";
import SquigglePlayground, { import SquigglePlayground, {
renderSquigglePlaygroundToDom, renderSquigglePlaygroundToDom,
} from "./components/SquigglePlayground"; } from "./components/SquigglePlayground";

View File

@ -14,10 +14,10 @@ It uses the symbols "K", "M", "B", and "T", to represent thousands, millions, bi
name="Ten Thousand" name="Ten Thousand"
args={{ args={{
number: 10000, number: 10000,
precision: 2 precision: 2,
}} }}
> >
{args => <NumberShower {...args}/>} {(args) => <NumberShower {...args} />}
</Story> </Story>
</Canvas> </Canvas>
@ -26,10 +26,10 @@ It uses the symbols "K", "M", "B", and "T", to represent thousands, millions, bi
name="Ten Billion" name="Ten Billion"
args={{ args={{
number: 10000000000, number: 10000000000,
precision: 2 precision: 2,
}} }}
> >
{args => <NumberShower {...args}/>} {(args) => <NumberShower {...args} />}
</Story> </Story>
</Canvas> </Canvas>
@ -38,10 +38,10 @@ It uses the symbols "K", "M", "B", and "T", to represent thousands, millions, bi
name="1.2*10^15" name="1.2*10^15"
args={{ args={{
number: 1200000000000000, number: 1200000000000000,
precision: 2 precision: 2,
}} }}
> >
{args => <NumberShower {...args}/>} {(args) => <NumberShower {...args} />}
</Story> </Story>
</Canvas> </Canvas>
@ -50,10 +50,10 @@ It uses the symbols "K", "M", "B", and "T", to represent thousands, millions, bi
name="1.35*10^-13" name="1.35*10^-13"
args={{ args={{
number: 0.000000000000135, number: 0.000000000000135,
precision: 2 precision: 2,
}} }}
> >
{args => <NumberShower {...args}/>} {(args) => <NumberShower {...args} />}
</Story> </Story>
</Canvas> </Canvas>

View File

@ -50,7 +50,8 @@ could be continuous, discrete or mixed.
<Story <Story
name="Mixed" name="Mixed"
args={{ 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({})} {Template.bind({})}

View File

@ -5,10 +5,12 @@
}, },
"module": "commonjs", "module": "commonjs",
"jsx": "react", "jsx": "react",
"skipLibCheck": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"noImplicitAny": false, "noImplicitAny": false,
"esModuleInterop": true, "esModuleInterop": true,
"removeComments": true, "removeComments": true,
"strict": true,
"preserveConstEnums": true, "preserveConstEnums": true,
"composite": true, "composite": true,
"outDir": "./dist", "outDir": "./dist",
@ -16,7 +18,10 @@
"declaration": true, "declaration": true,
"sourceMap": 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", "target": "ES6",
"include": ["src/**/*", "src/*"], "include": ["src/**/*", "src/*"],
"exclude": ["node_modules", "**/*.spec.ts", "webpack.config.js"], "exclude": ["node_modules", "**/*.spec.ts", "webpack.config.js"],

View File

@ -3,13 +3,15 @@ const path = require("path");
module.exports = { module.exports = {
mode: "production", mode: "production",
devtool: "source-map", devtool: "source-map",
profile: true,
entry: "./src/index.ts", entry: "./src/index.ts",
module: { module: {
rules: [ rules: [
{ {
test: /\.tsx?$/, test: /\.tsx?$/,
loader: "ts-loader", loader: "ts-loader",
options: { projectReferences: true }, include: path.resolve(__dirname, "src"),
options: { projectReferences: true, transpileOnly: true },
exclude: /node_modules/, exclude: /node_modules/,
}, },
{ {

View File

@ -1,3 +0,0 @@
*.bs.js
*.gen.tsx
dist

View File

@ -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 testRun = (x: string): squiggleExpression => {
let result = run(x, { sampleCount: 100, xyPointLength: 100 }); let result = run(x, { sampleCount: 100, xyPointLength: 100 });
expect(result.tag).toEqual("Ok") expect(result.tag).toEqual("Ok");
if (result.tag === "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))", () => { test("mean(normal(5,2))", () => {
expect(testRun("mean(normal(5,2))")).toEqual({ expect(testRun("mean(normal(5,2))")).toEqual({
tag: "number", tag: "number",
value: 5 value: 5,
}); });
}); });
test("10+10", () => { test("10+10", () => {

View File

@ -1,11 +1,26 @@
import * as _ from 'lodash' import * as _ from "lodash";
import type { import type {
exportEnv, exportEnv,
exportDistribution, exportDistribution,
} from "../rescript/ProgramEvaluator.gen"; } from "../rescript/ProgramEvaluator.gen";
export type { exportEnv, exportDistribution }; export type { exportEnv, exportDistribution };
import { genericDist, samplingParams, evaluate, expressionValue, errorValue, distributionError, toPointSet, continuousShape, discreteShape, distributionErrorToString } from "../rescript/TypescriptInterface.gen"; import {
export { makeSampleSetDist, errorValueToString, distributionErrorToString } from "../rescript/TypescriptInterface.gen"; genericDist,
samplingParams,
evaluate,
expressionValue,
errorValue,
distributionError,
toPointSet,
continuousShape,
discreteShape,
distributionErrorToString,
} from "../rescript/TypescriptInterface.gen";
export {
makeSampleSetDist,
errorValueToString,
distributionErrorToString,
} from "../rescript/TypescriptInterface.gen";
import { import {
Constructors_mean, Constructors_mean,
Constructors_sample, Constructors_sample,
@ -32,11 +47,11 @@ import {
Constructors_pointwiseLogarithm, Constructors_pointwiseLogarithm,
Constructors_pointwisePower, Constructors_pointwisePower,
} from "../rescript/Distributions/DistributionOperation/DistributionOperation.gen"; } from "../rescript/Distributions/DistributionOperation/DistributionOperation.gen";
export type {samplingParams, errorValue} export type { samplingParams, errorValue };
export let defaultSamplingInputs: samplingParams = { export let defaultSamplingInputs: samplingParams = {
sampleCount: 10000, sampleCount: 10000,
xyPointLength: 10000 xyPointLength: 10000,
}; };
export type result<a, b> = export type result<a, b> =
@ -61,16 +76,23 @@ export function resultMap<a, b, c>(
} }
function Ok<a, b>(x: a): result<a, b> { 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> { 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( export function run(
squiggleString: string, squiggleString: string,
samplingInputs?: samplingParams, samplingInputs?: samplingParams,
@ -80,14 +102,19 @@ export function run(
? samplingInputs ? samplingInputs
: defaultSamplingInputs; : defaultSamplingInputs;
let result: result<expressionValue, errorValue> = evaluate(squiggleString); let result: result<expressionValue, errorValue> = evaluate(squiggleString);
return resultMap(result, x => createTsExport(x, si)); return resultMap(result, (x) => createTsExport(x, si));
} }
function createTsExport(
function createTsExport(x: expressionValue, sampEnv: samplingParams): squiggleExpression { x: expressionValue,
sampEnv: samplingParams
): squiggleExpression {
switch (x.tag) { switch (x.tag) {
case "EvArray": case "EvArray":
return tag("array", x.value.map(x => createTsExport(x, sampEnv))); return tag(
"array",
x.value.map((x) => createTsExport(x, sampEnv))
);
case "EvBool": case "EvBool":
return tag("boolean", x.value); return tag("boolean", x.value);
case "EvDistribution": case "EvDistribution":
@ -95,26 +122,32 @@ function createTsExport(x: expressionValue, sampEnv: samplingParams): squiggleEx
case "EvNumber": case "EvNumber":
return tag("number", x.value); return tag("number", x.value);
case "EvRecord": 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 { export function resultExn<a, c>(r: result<a, c>): a | c {
return r.value; return r.value;
} }
export type point = { x: number, y: number} export type point = { x: number; y: number };
export type shape = { export type shape = {
continuous: point[] continuous: point[];
discrete: point[] discrete: point[];
} };
function shapePoints(x: continuousShape | discreteShape): point[] { function shapePoints(x: continuousShape | discreteShape): point[] {
let xs = x.xyShape.xs; let xs = x.xyShape.xs;
let ys = x.xyShape.ys; let ys = x.xyShape.ys;
return _.zipWith(xs, ys, (x, y) => ({x, y})) return _.zipWith(xs, ys, (x, y) => ({ x, y }));
} }
export class Distribution { export class Distribution {
@ -127,7 +160,9 @@ export class Distribution {
return this; 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)); return resultMap(r, (v: genericDist) => new Distribution(v, this.env));
} }
@ -158,30 +193,34 @@ export class Distribution {
} }
shape(): result<shape, distributionError> { 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") { if (pointSet.tag === "Ok") {
let distribution = pointSet.value; let distribution = pointSet.value;
if (distribution.tag === "Continuous") { if (distribution.tag === "Continuous") {
return Ok({ return Ok({
continuous: shapePoints(distribution.value), continuous: shapePoints(distribution.value),
discrete: [] discrete: [],
}) });
} } else if (distribution.tag === "Discrete") {
else if(distribution.tag === "Discrete"){
return Ok({ return Ok({
discrete: shapePoints(distribution.value), discrete: shapePoints(distribution.value),
continuous: [] continuous: [],
}) });
} } else {
else if(distribution.tag === "Mixed"){
return Ok({ return Ok({
discrete: shapePoints(distribution.value.discrete), discrete: shapePoints(distribution.value.discrete),
continuous: shapePoints(distribution.value.continuous) continuous: shapePoints(distribution.value.continuous),
}) });
} }
} } else {
else { return pointSet;
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( return this.mapResultDist(
Constructors_truncate({ env: this.env }, this.t, left, right) Constructors_truncate({ env: this.env }, this.t, left, right)
); );
@ -210,10 +252,9 @@ export class Distribution {
toString(): string { toString(): string {
let result = Constructors_toString({ env: this.env }, this.t); let result = Constructors_toString({ env: this.env }, this.t);
if (result.tag === "Ok") { if (result.tag === "Ok") {
return result.value return result.value;
} } else {
else { return distributionErrorToString(result.value);
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( return this.mapResultDist(
Constructors_algebraicLogarithm({ env: this.env }, this.t, d2.t) 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( return this.mapResultDist(
Constructors_pointwiseLogarithm({ env: this.env }, this.t, d2.t) Constructors_pointwiseLogarithm({ env: this.env }, this.t, d2.t)
); );

View File

@ -1 +1 @@
export type Dict_t<T> = { [key: string]: T } export type Dict_t<T> = { [key: string]: T };

View File

@ -7,6 +7,7 @@
"removeComments": true, "removeComments": true,
"preserveConstEnums": true, "preserveConstEnums": true,
"sourceMap": true, "sourceMap": true,
"strict": true,
"outDir": "./dist", "outDir": "./dist",
"declarationDir": "./dist", "declarationDir": "./dist",
"declaration": true, "declaration": true,

View File

@ -1 +0,0 @@
.docusaurus

View File

@ -4025,28 +4025,10 @@
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
"@types/react@*": "@types/react@*", "@types/react@17.0.43", "@types/react@^16.9.19", "@types/react@^18.0.1":
version "17.0.44" version "17.0.43"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.44.tgz#c3714bd34dd551ab20b8015d9d0dbec812a51ec7" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.43.tgz#4adc142887dd4a2601ce730bc56c3436fdb07a55"
integrity sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g== integrity sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==
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==
dependencies: dependencies:
"@types/prop-types" "*" "@types/prop-types" "*"
"@types/scheduler" "*" "@types/scheduler" "*"
@ -15495,6 +15477,13 @@ spdy@^4.0.2:
select-hose "^2.0.0" select-hose "^2.0.0"
spdy-transport "^3.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: split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"