Skip to content
This repository has been archived by the owner on Jul 16, 2020. It is now read-only.

Commit

Permalink
Use Belt
Browse files Browse the repository at this point in the history
  • Loading branch information
chenglou committed Mar 7, 2018
1 parent f6af288 commit 2b55828
Show file tree
Hide file tree
Showing 8 changed files with 95 additions and 93 deletions.
15 changes: 8 additions & 7 deletions lib/js/src/fetch/FetchExample.js
@@ -1,18 +1,19 @@
'use strict';

var $$Array = require("bs-platform/lib/js/array.js");
var Block = require("bs-platform/lib/js/block.js");
var Curry = require("bs-platform/lib/js/curry.js");
var React = require("react");
var Belt_Array = require("bs-platform/lib/js/belt_Array.js");
var Json_decode = require("@glennsl/bs-json/lib/js/src/Json_decode.bs.js");
var ReasonReact = require("reason-react/lib/js/src/ReasonReact.js");

function dogs(json) {
return $$Array.map((function (dog) {
var __x = Json_decode.field("message", (function (param) {
return Json_decode.array(Json_decode.string, param);
}), json);
return Belt_Array.map(__x, (function (dog) {
return dog;
}), Json_decode.field("message", (function (param) {
return Json_decode.array(Json_decode.string, param);
}), json));
}));
}

var Decode = /* module */[/* dogs */dogs];
Expand All @@ -36,11 +37,11 @@ function make() {
} else {
return React.createElement("div", undefined, React.createElement("h1", undefined, "Dogs"), React.createElement("p", undefined, "Source: "), React.createElement("a", {
href: "https://dog.ceo"
}, "https://dog.ceo"), React.createElement("ul", undefined, $$Array.map((function (dog) {
}, "https://dog.ceo"), React.createElement("ul", undefined, Belt_Array.map(match[0], (function (dog) {
return React.createElement("li", {
key: dog
}, dog);
}), match[0])));
}))));
}
});
newrecord[/* initialState */10] = (function () {
Expand Down
64 changes: 32 additions & 32 deletions lib/js/src/todomvc/App.js
@@ -1,13 +1,12 @@
'use strict';

var List = require("bs-platform/lib/js/list.js");
var $$Array = require("bs-platform/lib/js/array.js");
var Block = require("bs-platform/lib/js/block.js");
var Curry = require("bs-platform/lib/js/curry.js");
var React = require("react");
var $$String = require("bs-platform/lib/js/string.js");
var Caml_obj = require("bs-platform/lib/js/caml_obj.js");
var TodoItem = require("./TodoItem.js");
var Belt_List = require("bs-platform/lib/js/belt_List.js");
var Js_boolean = require("bs-platform/lib/js/js_boolean.js");
var Pervasives = require("bs-platform/lib/js/pervasives.js");
var ReactDOMRe = require("reason-react/lib/js/src/ReactDOMRe.js");
Expand Down Expand Up @@ -46,7 +45,19 @@ function make() {
var todos = state[/* todos */3];
var editing = state[/* editing */1];
var send = param[/* send */4];
var todoItems = List.map((function (todo) {
var __x = Belt_List.keep(todos, (function (todo) {
var match = state[/* nowShowing */0];
switch (match) {
case 0 :
return /* true */1;
case 1 :
return 1 - todo[/* completed */2];
case 2 :
return todo[/* completed */2];

}
}));
var todoItems = Belt_List.map(__x, (function (todo) {
var editing$1 = editing ? +(editing[0] === todo[/* id */0]) : /* false */0;
return ReasonReact.element(/* Some */[todo[/* id */0]], /* None */0, TodoItem.make(todo, editing$1, (function () {
return Curry._1(send, /* Destroy */Block.__(4, [todo]));
Expand All @@ -62,22 +73,11 @@ function make() {
}), (function () {
return Curry._1(send, /* Cancel */3);
}), /* array */[]));
}), List.filter((function (todo) {
var match = state[/* nowShowing */0];
switch (match) {
case 0 :
return /* true */1;
case 1 :
return 1 - todo[/* completed */2];
case 2 :
return todo[/* completed */2];

}
}))(todos));
var todosLength = List.length(todos);
var completedCount = List.length(List.filter((function (todo) {
return todo[/* completed */2];
}))(todos));
}));
var todosLength = Belt_List.length(todos);
var completedCount = Belt_List.length(Belt_List.keep(todos, (function (todo) {
return todo[/* completed */2];
})));
var activeTodoCount = todosLength - completedCount | 0;
var footer;
var exit = 0;
Expand All @@ -104,7 +104,7 @@ function make() {
})
}), React.createElement("ul", {
className: "todo-list"
}, $$Array.of_list(todoItems)));
}, Belt_List.toArray(todoItems)));
return React.createElement("div", undefined, React.createElement("header", {
className: "header"
}, React.createElement("h1", undefined, "todos"), React.createElement("input", {
Expand Down Expand Up @@ -163,9 +163,9 @@ function make() {
case 1 :
return /* NoUpdate */0;
case 2 :
var todos$1 = List.filter((function (todo) {
return 1 - todo[/* completed */2];
}))(state[/* todos */3]);
var todos$1 = Belt_List.keep(state[/* todos */3], (function (todo) {
return 1 - todo[/* completed */2];
}));
return /* UpdateWithSideEffects */Block.__(3, [
/* record */[
/* nowShowing */state[/* nowShowing */0],
Expand Down Expand Up @@ -205,7 +205,7 @@ function make() {
case 2 :
var text = action[1];
var todoToSave = action[0];
var todos$2 = List.map((function (todo) {
var todos$2 = Belt_List.map(state[/* todos */3], (function (todo) {
var match = Caml_obj.caml_equal(todo, todoToSave);
if (match !== 0) {
return /* record */[
Expand All @@ -216,7 +216,7 @@ function make() {
} else {
return todo;
}
}), state[/* todos */3]);
}));
return /* UpdateWithSideEffects */Block.__(3, [
/* record */[
/* nowShowing */state[/* nowShowing */0],
Expand All @@ -237,9 +237,9 @@ function make() {
]]);
case 4 :
var todo = action[0];
var todos$3 = List.filter((function (candidate) {
return +(candidate !== todo);
}))(state[/* todos */3]);
var todos$3 = Belt_List.keep(state[/* todos */3], (function (candidate) {
return +(candidate !== todo);
}));
return /* UpdateWithSideEffects */Block.__(3, [
/* record */[
/* nowShowing */state[/* nowShowing */0],
Expand All @@ -253,7 +253,7 @@ function make() {
]);
case 5 :
var todoToToggle = action[0];
var todos$4 = List.map((function (todo) {
var todos$4 = Belt_List.map(state[/* todos */3], (function (todo) {
var match = Caml_obj.caml_equal(todo, todoToToggle);
if (match !== 0) {
return /* record */[
Expand All @@ -264,7 +264,7 @@ function make() {
} else {
return todo;
}
}), state[/* todos */3]);
}));
return /* UpdateWithSideEffects */Block.__(3, [
/* record */[
/* nowShowing */state[/* nowShowing */0],
Expand All @@ -278,13 +278,13 @@ function make() {
]);
case 6 :
var checked = action[0];
var todos$5 = List.map((function (todo) {
var todos$5 = Belt_List.map(state[/* todos */3], (function (todo) {
return /* record */[
/* id */todo[/* id */0],
/* title */todo[/* title */1],
/* completed */checked
];
}), state[/* todos */3]);
}));
return /* UpdateWithSideEffects */Block.__(3, [
/* record */[
/* nowShowing */state[/* nowShowing */0],
Expand Down
4 changes: 2 additions & 2 deletions package.json
Expand Up @@ -19,12 +19,12 @@
"bs-fetch": "^0.2.1",
"react": "^15.4.2",
"react-dom": "^15.4.2",
"reason-react": "^0.3.2",
"reason-react": "^0.3.3",
"todomvc-app-css": "^2.0.0",
"todomvc-common": "^1.0.1"
},
"devDependencies": {
"bs-platform": "^2.2.0",
"bs-platform": "^2.2.2",
"concurrently": "^3.5.0",
"webpack": "^1.14.0"
}
Expand Down
12 changes: 7 additions & 5 deletions src/fetch/FetchExample.re
@@ -1,3 +1,6 @@
/* The new stdlib additions */
open Belt;

type dog = string;

type state =
Expand All @@ -13,7 +16,7 @@ type action =
module Decode = {
let dogs = json : array(dog) =>
Json.Decode.(
json |> field("message", array(string)) |> Array.map(dog => dog)
json |> field("message", array(string)) |> Array.map(_, dog => dog)
);
};

Expand Down Expand Up @@ -66,10 +69,9 @@ let make = _children => {
</a>
<ul>
(
dogs
|> Array.map(dog =>
<li key=dog> (ReasonReact.stringToElement(dog)) </li>
)
Array.map(dogs, dog =>
<li key=dog> (ReasonReact.stringToElement(dog)) </li>
)
|> ReasonReact.arrayToElement
)
</ul>
Expand Down
2 changes: 1 addition & 1 deletion src/interop/GreetingRe.re
Expand Up @@ -25,7 +25,7 @@ let jsComponent =
ReasonReact.wrapReasonForJs(~component, jsProps =>
make(
~message=jsProps##message,
~extraGreeting=?Js.Null_undefined.to_opt(jsProps##extraGreeting),
~extraGreeting=?Js.Nullable.toOption(jsProps##extraGreeting),
[||],
)
);
88 changes: 44 additions & 44 deletions src/todomvc/App.re
@@ -1,3 +1,6 @@
/* The new stdlib additions */
open Belt;

[@bs.val] external unsafeJsonParse : string => 'a = "JSON.parse";

let localStorageNamespace = "reason-react-todos";
Expand Down Expand Up @@ -64,27 +67,24 @@ module Top = {
}
| ClearCompleted =>
let todos =
List.filter(todo => ! TodoItem.(todo.completed), state.todos);
List.keep(state.todos, todo => ! TodoItem.(todo.completed));
ReasonReact.UpdateWithSideEffects(
{...state, todos},
(_self => saveLocally(todos)),
);
| ToggleAll(checked) =>
let todos =
List.map(
todo => {...todo, TodoItem.completed: checked},
state.todos,
List.map(state.todos, todo =>
{...todo, TodoItem.completed: checked}
);
ReasonReact.UpdateWithSideEffects(
{...state, todos},
(_self => saveLocally(todos)),
);
| Save(todoToSave, text) =>
let todos =
List.map(
todo =>
todo == todoToSave ? {...todo, TodoItem.title: text} : todo,
state.todos,
List.map(state.todos, todo =>
todo == todoToSave ? {...todo, TodoItem.title: text} : todo
);
ReasonReact.UpdateWithSideEffects(
{...state, editing: None, todos},
Expand All @@ -93,19 +93,17 @@ module Top = {
| Edit(todo) =>
ReasonReact.Update({...state, editing: Some(TodoItem.(todo.id))})
| Destroy(todo) =>
let todos = List.filter(candidate => candidate !== todo, state.todos);
let todos = List.keep(state.todos, candidate => candidate !== todo);
ReasonReact.UpdateWithSideEffects(
{...state, todos},
(_self => saveLocally(todos)),
);
| Toggle(todoToToggle) =>
let todos =
List.map(
todo =>
todo == todoToToggle ?
{...todo, TodoItem.completed: ! TodoItem.(todo.completed)} :
todo,
state.todos,
List.map(state.todos, todo =>
todo == todoToToggle ?
{...todo, TodoItem.completed: ! TodoItem.(todo.completed)} :
todo
);
ReasonReact.UpdateWithSideEffects(
{...state, todos},
Expand Down Expand Up @@ -139,36 +137,38 @@ module Top = {
render: ({state, send}) => {
let {todos, editing} = state;
let todoItems =
todos
|> List.filter(todo =>
TodoItem.(
switch (state.nowShowing) {
| ActiveTodos => ! todo.completed
| CompletedTodos => todo.completed
| AllTodos => true
}
)
)
|> List.map(todo => {
let editing =
switch (editing) {
| None => false
| Some(editing) => editing === TodoItem.(todo.id)
};
<TodoItem
key=todo.id
todo
onToggle=(_event => send(Toggle(todo)))
onDestroy=(_event => send(Destroy(todo)))
onEdit=(_event => send(Edit(todo)))
editing
onSave=(text => send(Save(todo, text)))
onCancel=(_event => send(Cancel))
/>;
});
List.keep(todos, todo =>
TodoItem.(
switch (state.nowShowing) {
| ActiveTodos => ! todo.completed
| CompletedTodos => todo.completed
| AllTodos => true
}
)
)
|> List.map(
_,
todo => {
let editing =
switch (editing) {
| None => false
| Some(editing) => editing === TodoItem.(todo.id)
};
<TodoItem
key=todo.id
todo
onToggle=(_event => send(Toggle(todo)))
onDestroy=(_event => send(Destroy(todo)))
onEdit=(_event => send(Edit(todo)))
editing
onSave=(text => send(Save(todo, text)))
onCancel=(_event => send(Cancel))
/>;
},
);
let todosLength = List.length(todos);
let completedCount =
todos |> List.filter(todo => TodoItem.(todo.completed)) |> List.length;
List.keep(todos, todo => TodoItem.(todo.completed)) |> List.length;
let activeTodoCount = todosLength - completedCount;
let footer =
switch (activeTodoCount, completedCount) {
Expand Down Expand Up @@ -202,7 +202,7 @@ module Top = {
checked=(Js.Boolean.to_js_boolean(activeTodoCount === 0))
/>
<ul className="todo-list">
(ReasonReact.arrayToElement(Array.of_list(todoItems)))
(ReasonReact.arrayToElement(List.toArray(todoItems)))
</ul>
</section>;
<div>
Expand Down
2 changes: 1 addition & 1 deletion src/todomvc/TodoItem.re
Expand Up @@ -19,7 +19,7 @@ type action =
let component = ReasonReact.reducerComponent("TodoItemRe");

let setEditFieldRef = (r, {ReasonReact.state}) =>
state.editFieldRef := Js.Nullable.to_opt(r);
state.editFieldRef := Js.Nullable.toOption(r);

let make =
(
Expand Down

0 comments on commit 2b55828

Please sign in to comment.