(+) infix operator
Before:
Cn.("one" + "two" + "three")
After:
`one two three`
let routes = { | |
// Regular JS regex over cleaned up URL. | |
'book/(\\d+)?/edit': (id) => console.log('handleBookEdit', id), | |
'book/(\\d+)?/.+': (_id, _) => console.log('noSuchBookOperation'), | |
'book/(\\d+)?': (id) => console.log('getBook', id), | |
'shop/(\\d+)?/(\\d+)?': (a, b) => console.log('showSecretShopPage', a, b), | |
'shop/index': () => console.log('showShoppingPage'), | |
'shop/(.+)': (rest) => console.log('nestedMatch', rest), | |
'shop': () => console.log('showShoppingPage'), |
function pointsOnEllipse1(cx, cy, rx, ry, n) { | |
const points = Array(n); | |
const step = Math.PI / (n / 2); | |
let sin = 0; | |
let cos = 1; | |
const a = Math.cos(step); | |
const b = Math.sin(step); |
(+) infix operator
Before:
Cn.("one" + "two" + "three")
After:
`one two three`
append
// bindings can be isolated/upstreamed. I'm inlining it just for the example | |
type request; | |
type response; | |
[@bs.new] external makeXMLHttpRequest: unit => request = "XMLHttpRequest"; | |
[@bs.send] external addEventListener: (request, string, unit => unit) => unit = "addEventListener"; | |
[@bs.get] external response: request => response = "response"; | |
[@bs.send] external open_: (request, string, string) => unit = "open"; | |
[@bs.send] external send: request => unit = "send"; | |
[@bs.send] external abort: request => unit = "abort"; | |
// ========= |
// This is a proper alternative to | |
// https://github.com/BuckleScript/bucklescript/blob/b9508105b1a35537bdea9a1fabd10f6c65f776b4/jscomp/bsb/templates/react-hooks/src/FetchedDogPictures/FetchedDogPictures.re#L14 | |
// The one in that file uses Promise, but that's *wrong*. | |
// We only used promise as a demo of its API. We'll remove it soon. | |
// As you can see below, the pure XMLHttpRequest code is just as clean, | |
// less mysterious for all, more performant, extensible, and actually correct. | |
// Ignore these externals for now. They're just for illustration | |
// purposes. I just copy pasted the Js code from |
open Result | |
open TopTypes | |
open Infix | |
let extend = (obj, items) => Json.obj(obj) |?>> current => Json.Object(current @ items) | |
let log = Log.log | |
let maybeHash = (h, k) => if Hashtbl.mem(h, k) { Some(Hashtbl.find(h, k)) } else { None } |
title |
---|
Reason 3.2.0 |
This release is best used in conjunction with upgrading your project to bs-platform 3.1.4
.
Rejoice! The release you've all been waiting for. This fixes bring three major quality-of-life improvements when using Reason's formatter, refmt
.
reducer: { | |
| Edit => (state) => ReasonReact.Update({...state, editText: todo.title}) | |
| Submit => submitHelper | |
| Change(text) => | |
(state) => | |
editing ? | |
ReasonReact.Update({...state, editText: text}) : | |
ReasonReact.NoUpdate | |
| KeyDown(27) => | |
/* escape key */ |
Assuming JS (this transfers to ReasonReact too): owner renders <Child onClick={this.onClick} />
. Child renders <div onClick={this.onClick} />
.
Upon div DOM click event:
/* == definition == */ | |
/* two labelled arguments, one unlabelled */ | |
let display = (~message, ~person, time) => 1; | |
/* with default value */ | |
let display = (~message="hello", ~person="Reason", time) => 1; | |
/* with type annotation */ | |
let display = (~message: string, ~person: string, time: float) => 1; | |
/* type annoation and with default */ | |
let display = (~message: string="hello", ~person: string="Reason", time: float) => 1; |