diff --git a/packages/components/src/components/SquiggleChart.tsx b/packages/components/src/components/SquiggleChart.tsx index b8be8c7f..3605e93d 100644 --- a/packages/components/src/components/SquiggleChart.tsx +++ b/packages/components/src/components/SquiggleChart.tsx @@ -1,6 +1,11 @@ import * as React from "react"; import _ from "lodash"; -import { run, errorValueToString } from "@quri/squiggle-lang"; +import styled from "styled-components"; +import { + run, + errorValueToString, + squiggleExpression, +} from "@quri/squiggle-lang"; import type { samplingParams, exportEnv } from "@quri/squiggle-lang"; import { NumberShower } from "./NumberShower"; import { DistributionChart } from "./DistributionChart"; @@ -30,6 +35,93 @@ export interface SquiggleChartProps { height?: number; } +export interface SquiggleItemProps { + /** The input string for squiggle */ + expression: squiggleExpression; + width: number; + height: number; +} + +const ShowBox = styled.div` + border: 1px solid #ddd; +`; + +const ShowBoxHeading = styled.div` + border-bottom: 1px solid #ddd; + padding: 0.4em 0.8em; +`; + +const ShowBoxPadding = styled.div` + padding: 0.4em 0.8em; +`; + +export const Box: React.FC<{ + heading: string; + children: React.ReactNode; +}> = ({ heading = "Error", children }) => { + return ( + + +

{heading}

+
+ {children} +
+ ); +}; + +const SquiggleItem: React.FC = ({ + expression, + width, + height, +}: SquiggleItemProps) => { + if (expression.tag === "number") { + return ( + + + + ); + } else if (expression.tag === "distribution") { + let distType = expression.value.type(); + return ( + + + + ); + } else if (expression.tag === "string") { + return ({expression.value}); + } else if (expression.tag === "boolean") { + return ( + + ({expression.value == true ? "True" : "False"}) + + ); + } else if (expression.tag === "symbol") { + return ({expression.value}); + } else if (expression.tag === "call") { + return ({expression.value}); + } else if (expression.tag === "array") { + return ( + +
+ {expression.value.map((r) => ( + + ))} +
+
+ ); + } else { + return ( + + {"We don't currently have a viewer for record types."} + + ); + } +}; + export const SquiggleChart: React.FC = ({ squiggleString = "", sampleCount = 1000, @@ -48,23 +140,9 @@ export const SquiggleChart: React.FC = ({ if (expressionResult.tag === "Ok") { onEnvChange(environment); let expression = expressionResult.value; - if (expression.tag === "number") { - return ; - } else if (expression.tag === "distribution") { - return ( - - ); - } else { - return ( - - {"We don't currently have a viewer for this type: " + expression.tag} - - ); - } + return ( + + ); } else { // At this point, we came across an error. What was our error? return ( diff --git a/packages/squiggle-lang/src/js/index.ts b/packages/squiggle-lang/src/js/index.ts index 4b8cddab..e2239f71 100644 --- a/packages/squiggle-lang/src/js/index.ts +++ b/packages/squiggle-lang/src/js/index.ts @@ -47,6 +47,7 @@ import { Constructors_pointwiseLogarithm, Constructors_pointwisePower, } from "../rescript/Distributions/DistributionOperation/DistributionOperation.gen"; +import { pointSetDistFn } from "../rescript/OldInterpreter/DistPlus.bs"; export type { samplingParams, errorValue }; export let defaultSamplingInputs: samplingParams = { @@ -195,6 +196,10 @@ export class Distribution { ); } + type(){ + return this.t.tag; + } + pointSet(): result { let pointSet = toPointSet( this.t,