Skip to content

Instantly share code, notes, and snippets.

View raynerpupo's full-sized avatar

Rayner Pupo raynerpupo

  • ThoughtWorks.
View GitHub Profile
@raynerpupo
raynerpupo / gist:8b628c2a01b7cee98782e8681a076318
Last active January 13, 2017 19:57
Spike to research about tools to display charts

Selected library

Chartjs is a free and open source library widely used by the comunity, it supports several types of charts like the doughnut.

Usage

From the library docs

@raynerpupo
raynerpupo / prototyping.md
Created March 9, 2018 16:42
JS Prototyping exercise

#Shapes Using the new ES6 features related to prototyping, implement a small library to define geometric shapes (not visually) and allow basic calculations. ###Requirements

  • The shapes to define are Circle, Square and Rectangle.
  • All shapes must define a function to calculate the area and perimeter .
  • Use a only positive coordinate system (implement validations while building the shapes or changing its properties).
  • Implement a predicate function collidesWith to check if the shape collides with another shape of the same type.
  • Given a list of shapes, print its properties and the area and perimeter properties.
  • All functionalities should be properly tested.

Callbacks

Are basically functions that are called when some result is ready or they can also be used to signal errors.

function aDividedByB(a, b, onResultFn, onErrorFn) {
  if (b != 0) {
    return onResultFn(a / b);
  }
  return onErrorFn("The divisor can't be zero!");
}

Node Error first callback

The expected callback function

This kind of callback function have the error as the first parameter and the actual value as the second

function incrementAndLog(err, value) {
  if (err) {
    console.log("there's no value to increment");
    return;

Call apply and bind

Call and Apply

The call and apply functions are similar, they expect a the contex (this) and the parameter to call the function, the only difference is that apply accepts the function parameters in an array.

const calculate = function(x, y) {
  return this.operation(x, y);
}

const multiply = {

Async / Await

Async and await let us handle asynchronous code easily, it's somehow similar to generators, pausing the execution whenever the await is prefixed:

// To be able to wait for a call we need to mark a function as async
async function getTemperature () {
// We wait until the getWeather function returns the value
  const weather = await getWeather(....);
 

Mixins

Mixins favors composition over inheritance by adding some custom behavior to an existing object

const fulfillable = {
  fullfill: (doneFunction) => done("OK")
};

const myObj = {
 quit: () => console.log("quit"),

Coercion

Coercion is an implicit conversion of types:

// amount is a number
var amount = 32;

// since " years" is a string there is a implicit conversion of amount to string
var age = amount + " years";
console.log(age); // => 32 years

Modern JavaScript

Template literals

Multiline strings

Default parameters

Classes

export {}
// A monoid is a binary associative operation with an identity
// Laws
// 1 - Associativity: (x <> y) <> z = x <> (y <> z)
// 2 - Left identity: mempty <> x = x
// 3 - Right identity: x <> mempty = x
type Monoid<A = any> = {
mempty: A,