Skip to content

Commit

Permalink
update toplevel, finalize bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiaskern committed Sep 4, 2018
1 parent bfaec94 commit 25fc71b
Show file tree
Hide file tree
Showing 11 changed files with 25,024 additions and 14,301 deletions.
39,173 changes: 24,917 additions & 14,256 deletions client/public/toplevel.js

Large diffs are not rendered by default.

15 changes: 11 additions & 4 deletions client/src_analyzer/Worker_Analyze.re
Expand Up @@ -88,15 +88,22 @@ module Make = (ESig: Worker_Evaluator.EvaluatorSig) => {
let filename = name ++ Editor_Types.langToExtension(lang);


Evaluator.insertModule(filename, code);
switch (lang) {
| Editor_Types.ML => Evaluator.mlSyntax()
| Editor_Types.RE => Evaluator.reSyntax()
};

Evaluator.insertModule(. filename, code);
};

exception Not_Implemented;

let linkMany:
(. Editor_Types.lang, list(Editor_Types.Link.link)) =>
(. list(Editor_Types.Link.link)) =>
list((Editor_Types.Link.link, linkResult)) =
(. lang, links) => {
(. links) => {
/* Reset before evaluating several blocks */
Evaluator.reset();
open Editor_Types.Link;
let rec loop = (links, acc) =>
switch (links) {
Expand All @@ -105,7 +112,7 @@ module Make = (ESig: Worker_Evaluator.EvaluatorSig) => {
let (name, result) =
switch (singleLink) {
| Internal(internalLink) =>
let {name, code} = internalLink;
let {lang, name, code} = internalLink;
let result = link(. lang, name, code);
(singleLink, result);
| External(_) => raise(Not_Implemented)
Expand Down
4 changes: 2 additions & 2 deletions client/src_analyzer/Worker_BrowserEvaluator.re
Expand Up @@ -5,7 +5,7 @@ open Worker_Evaluator.Types;
[@bs.val] external mlSyntax: unit => unit = "evaluator.mlSyntax";
[@bs.val] external reSyntax: unit => unit = "evaluator.reasonSyntax";
[@bs.val]
external insertModule: (string, string) => Worker_Evaluator.Types.linkResult =
external insertModule: (. string, string) => Worker_Evaluator.Types.linkResult =
"evaluator.insertModule";

/* Implementation */
Expand All @@ -22,4 +22,4 @@ external printML: Refmt.implementationAST => string = "refmt.printML";
[@bs.val] external parseREI: string => Refmt.interfaceAST = "refmt.parseREI";
[@bs.val] external parseMLI: string => Refmt.interfaceAST = "refmt.parseMLI";
[@bs.val] external printREI: Refmt.interfaceAST => string = "refmt.printREI";
[@bs.val] external printMLI: Refmt.interfaceAST => string = "refmt.printMLI";
[@bs.val] external printMLI: Refmt.interfaceAST => string = "refmt.printMLI";
6 changes: 3 additions & 3 deletions client/src_analyzer/Worker_Evaluator.re
Expand Up @@ -34,7 +34,7 @@ module Types = {
type refmtManyResult = list((Editor_Types.id, string, option(error)));
};

type linkResult = Belt.Result.t(bool, exn);
type linkResult = Worker_Types.linkResult;
};

module type EvaluatorSig = {
Expand All @@ -52,7 +52,7 @@ module type EvaluatorSig = {
let parseMLI: string => Types.Refmt.interfaceAST;
let printML: Types.Refmt.implementationAST => string;
let printMLI: Types.Refmt.interfaceAST => string;
let insertModule: (string, string) => Types.linkResult;
let insertModule: (. string, string) => Types.linkResult;
};

module Make = (B: EvaluatorSig) => {
Expand All @@ -78,5 +78,5 @@ module Make = (B: EvaluatorSig) => {
let printREI = B.printREI;
let printML = B.printML;
let printMLI = B.printMLI;
let insertModule = (name, content) => B.insertModule(name, content);
let insertModule = (. name, content) => B.insertModule(. name, content);
};
2 changes: 1 addition & 1 deletion client/src_analyzer/Worker_NodeEvaluator.re
Expand Up @@ -14,5 +14,5 @@ external mlSyntax: unit => unit = "mlSyntax";
external reSyntax: unit => unit = "reasonSyntax";

[@bs.scope "evaluator"] [@bs.module "../public/reason_v2.js"]
external insertModule: (string, string) => Worker_Evaluator.Types.linkResult =
external insertModule: (. string, string) => Worker_Evaluator.Types.linkResult =
"insertModule";
2 changes: 1 addition & 1 deletion client/src_analyzer/Worker_Types.re
Expand Up @@ -26,4 +26,4 @@ type blockData = {
block_loc: (pos, pos),
};

type linkResult = Belt.Result.t(bool, exn);
type linkResult = Belt.Result.t(unit, string);
12 changes: 12 additions & 0 deletions client/src_editor/Editor_Blocks_Utils.re
Expand Up @@ -204,6 +204,7 @@ let findLastCodeBlock = blocks => {
* Other Block Utils
*/


let codeBlockDataPairs = blocks =>
Toplevel.Types.(
blocks
Expand All @@ -224,3 +225,14 @@ let codeBlockDataPairs = blocks =>
)
->Belt.List.reverse
);

let concatCodeBlocksToString = blocks =>
blocks
->(
Belt.Array.reduceU("", (. acc, {b_data}) =>
switch (b_data) {
| B_Text(_) => acc
| B_Code({bc_value}) => acc ++ bc_value
}
)
);
6 changes: 4 additions & 2 deletions client/src_editor/Editor_Json.re
Expand Up @@ -32,9 +32,11 @@ module V1 = {
let langDecoder: Js.Json.t => lang =
json => json |> string |> stringToLang;

external jsonIdentity: Js.Json.t => Js.Json.t = "%identity";

let internalBlockDecoder: Js.Json.t => Link.internalLink =
json => {
revision_at: json |> field("timestamp", string),
revision_at: json |> field("timestamp", jsonIdentity),
sketch_id: json |> field("id", string),
name: json |> field("name", string),
lang: json |> field("lang", langDecoder),
Expand Down Expand Up @@ -102,7 +104,7 @@ module V1 = {
("sketch_id", string(internalLink.sketch_id)),
("name", string(internalLink.name)),
("lang", internalLink.lang |> langToString |> string),
("timestamp", string(internalLink.revision_at)),
("timestamp", internalLink.revision_at),
("code", string(internalLink.code)),
])
| External () => object_([])
Expand Down
98 changes: 68 additions & 30 deletions client/src_editor/Editor_Links.re
Expand Up @@ -2,14 +2,14 @@ Modules.require("./Editor_Links.css");

module GetLink = [%graphql
{|
query getNote (
$noteId: String!
) {
note: note (where: {id : {_eq: $noteId}}) {
...GqlFragment.Editor.EditorNote
query getNote (
$noteId: String!
) {
note: note (where: {id : {_eq: $noteId}}) {
...GqlFragment.Editor.EditorNote
}
}
}
|}
|}
];

module GetLinkComponent = ReasonApollo.CreateQuery(GetLink);
Expand All @@ -26,11 +26,12 @@ type link =
type linkStatus =
| NotAsked
| Error
| Loading;
| Loading
| Fetched;

type action =
| Link_Add(uiLink)
| Link_Fetched
| Link_Fetched(Link.link)
| Link_Update(Link.link)
| Link_Delete;

Expand Down Expand Up @@ -59,16 +60,22 @@ module EmptyLink = {
| UpdateName(string);

let component = ReasonReact.reducerComponent("Editor_EmptyLink");
let make = (~status, ~onSubmit, ~name="", ~id="", _children) => {
let make = (~status, ~onSubmit, ~onFetched=?, ~name="", ~id="", _children) => {
...component,
initialState: () => {name, id},
didMount: _ =>
switch (onFetched) {
| None => ()
| Some(f) => f()
},
reducer: (action, state) =>
switch (action) {
| UpdateId(id) => ReasonReact.Update({...state, id})
| UpdateName(name) => ReasonReact.Update({...state, name})
},
render: ({send, state}) =>
<div>
(status == Loading ? "loading"->str : ReasonReact.null)
<input
className="link__input"
value=state.id
Expand All @@ -93,31 +100,45 @@ module EmptyLink = {

let component = ReasonReact.reducerComponent("Editor_Links");

let make = (~links, ~onLinkAdd, _children) => {
let make = (~links, ~onUpdate, _children) => {
...component,
initialState: () => {links, fetchingLink: None},
reducer: (action: action, state: state) =>
switch (action) {
| Link_Add((name, id)) =>
ReasonReact.Update({...state, fetchingLink: Some((name, id))})
| Link_Fetched => ReasonReact.Update({...state, fetchingLink: None})
| Link_Fetched(link) =>
ReasonReact.UpdateWithSideEffects(
{...state, fetchingLink: None},
(
_ => {
let links = Belt.Array.concat(state.links, [|link|]);

links->Belt.Array.length->string_of_int->Js.log;
onUpdate(links);
}
),
)
| _ => ReasonReact.NoUpdate
},
render: ({send, state}) =>
render: ({send, state}) => {
let existingLinks =
links
->Belt.Array.mapU(
(. link: Link.link) =>
switch (link) {
| Internal({sketch_id, name}) => singleLink(name, sketch_id)
| External () => ReasonReact.null
},
);
existingLinks->Belt.Array.length->string_of_int->Js.log;

<div className="links__container">
<span className="links__disclaimer">
"Add a link to another sketch by pasting it's id and giving it a module name"
->str
</span>
<div
/* state.links->Belt.Array.mapU(
(. link) =>
switch (link) {
| Internal({sketch_id, name}) => singleLink(name, sketch_id)
| External () => ReasonReact.null
})
->ReasonReact.array */
/>
<div> existingLinks->ReasonReact.array </div>
(
switch (state.fetchingLink) {
| None =>
Expand Down Expand Up @@ -146,22 +167,39 @@ let make = (~links, ~onLinkAdd, _children) => {
onSubmit=(uiLink => send(Link_Add(uiLink)))
/>
| Data(response) =>
let notes = response##note;
let note = Belt.Array.getUnsafe(notes, 0);
Js.log(note##id);
Js.log(note##title);
onLinkAdd(note);
send(Link_Fetched) |> ignore;
let note = response##note[0];

/* TODO handle links that also have links */
let (lang, _links, blocks) =
switch (note##data) {
| None => (Editor_Types.RE, [||], [||])
| Some(data) => Editor_Json.V1.decode(data)
};

let link: Link.link =
Internal({
revision_at: note##updated_at,
sketch_id: note##id,
name,
lang,
code:
Editor_Blocks_Utils.concatCodeBlocksToString(
blocks,
),
});

<EmptyLink
status=Loading
status=Fetched
id
name
onSubmit=(uiLink => send(Link_Add(uiLink)))
onFetched=(() => send(Link_Fetched(link)))
/>;
}
)
</GetLinkComponent>;
}
)
</div>,
</div>;
},
};
2 changes: 1 addition & 1 deletion client/src_editor/Editor_Types.re
Expand Up @@ -100,7 +100,7 @@ module Block = {

module Link = {
type internalLink = {
revision_at: string,
revision_at: Js.Json.t,
sketch_id: string,
name: string,
lang,
Expand Down
5 changes: 4 additions & 1 deletion client/src_editor/Editor_Worker.re
Expand Up @@ -17,8 +17,10 @@ open Editor_Types;
[@bs.deriving abstract]
type toplevel = {
link:
(. Editor_Types.lang, string, array((string, string))) =>
(. Editor_Types.lang, string, string) =>
Js.Promise.t(Worker_Types.linkResult),
linkMany:
(. list(Editor_Types.Link.link)) => Js.Promise.t(Worker_Types.linkResult),
execute: (. bool, string) => Js.Promise.t(list(Worker_Types.blockData)),
executeMany:
(. lang, list((id, string))) =>
Expand All @@ -39,3 +41,4 @@ let reToMl = toplevel->reToMlGet;
let reToRe = toplevel->reToReGet;
let mlToRe = toplevel->mlToReGet;
let link = toplevel->linkGet;
let linkMany = toplevel->linkManyGet;

0 comments on commit 25fc71b

Please sign in to comment.