Skip to content

Instantly share code, notes, and snippets.

@mvaldesdeleon
Created August 12, 2018 09:27
Show Gist options
  • Save mvaldesdeleon/2a1072107ce51840f817575ad2be0c47 to your computer and use it in GitHub Desktop.
Save mvaldesdeleon/2a1072107ce51840f817575ad2be0c47 to your computer and use it in GitHub Desktop.
// getEmptyPlate :: IxBurgerBuilder Ready EmptyPlate BurgerSpec
// getEmptyPlate = IxBurgerBuilder mempty
const getEmptyPlate = new IxBurgerBuilder<Ready, EmptyPlate, BurgerSpec>([]);
// addIngredient :: forall i o. String -> BurgerSpec -> IxBurgerBuilder i o (BurgerSpec)
// addIngredient x xs = IxBurgerBuilder $ Ingredient x : xs
const addIngredient = <I, O>(s: string) => (spec: BurgerSpec) => new IxBurgerBuilder<I ,O, BurgerSpec>(spec.concat([s]));
// -- ADDING THE BUN
// placeEmptyBun :: BurgerSpec -> IxBurgerBuilder EmptyPlate BottomBunOn BurgerSpec
// placeEmptyBun = addIngredient "Bottom Bun"
const placeEmptyBun = addIngredient<EmptyPlate, BottomBunOn> ("Bottom Bun")
// -- ADD SOME SAUCES DIRECTLY ON THE BOTTOM BUN
// addKetchup :: BurgerSpec -> IxBurgerBuilder BottomBunOn BottomBunOn BurgerSpec
// addKetchup = addIngredient "Ketchup"
const addKetchup = addIngredient<BottomBunOn, BottomBunOn> ("Ketchup")
const addMayo = addIngredient<BottomBunOn, BottomBunOn> ("Mayo")
const addMustard = addIngredient<BottomBunOn, BottomBunOn> ("Mustard")
// -- PUT THE PATTY ON, NO MORE SAUCES
// addPatty :: BurgerSpec -> IxBurgerBuilder BottomBunOn PattyOn BurgerSpec
// addPatty = addIngredient "Patty"
const addPatty = addIngredient<BottomBunOn, PattyOn> ("Patty")
// -- NEXT IS THE CHEESE, OR NONE
// addCheese :: BurgerSpec -> IxBurgerBuilder PattyOn CheeseOn BurgerSpec
// addCheese = addIngredient "Cheese"
const addCheese = addIngredient<PattyOn, CheeseOn> ("Cheese")
// noCheese :: BurgerSpec -> IxBurgerBuilder PattyOn CheeseOn BurgerSpec
// noCheese = IxBurgerBuilder
const noCheese = (spec: BurgerSpec) => new IxBurgerBuilder<PattyOn, CheeseOn, BurgerSpec>(spec);
// addOnions :: BurgerSpec -> IxBurgerBuilder CheeseOn OnionOn BurgerSpec
// addOnions = addIngredient "Onion"
const addOnions = addIngredient<CheeseOn, OnionOn> ("Onion")
// noOnions :: BurgerSpec -> IxBurgerBuilder CheeseOn OnionOn BurgerSpec
// noOnions = IxBurgerBuilder
const noOnions = (spec: BurgerSpec) => new IxBurgerBuilder<CheeseOn, OnionOn, BurgerSpec>(spec);
// -- THEN LETTUCE, OR NONE
// addLettuce :: BurgerSpec -> IxBurgerBuilder OnionOn LettuceOn BurgerSpec
// addLettuce = addIngredient "Lettuce"
const addLettuce = addIngredient<OnionOn, LettuceOn> ("Lettuce")
// noLettuce :: BurgerSpec -> IxBurgerBuilder OnionOn LettuceOn BurgerSpec
// noLettuce = IxBurgerBuilder
const noLettuce = (spec: BurgerSpec) => new IxBurgerBuilder<OnionOn, LettuceOn, BurgerSpec>(spec);
// -- THEN TOMATO, OR NONE
// addTomato :: BurgerSpec -> IxBurgerBuilder LettuceOn TomatoOn BurgerSpec
// addTomato = addIngredient "Tomato"
const addTomato = addIngredient<LettuceOn, TomatoOn> ("Tomato")
// noTomato :: BurgerSpec -> IxBurgerBuilder LettuceOn TomatoOn BurgerSpec
// noTomato = IxBurgerBuilder
const noTomato = (spec: BurgerSpec) => new IxBurgerBuilder<LettuceOn, TomatoOn, BurgerSpec>(spec);
// -- THEN FINISH THE BURGER WITH THE TOP BUN
// addTopBun :: BurgerSpec -> IxBurgerBuilder TomatoOn TopBunOn BurgerSpec
// addTopBun = addIngredient "TopBun"
const addTopBun = addIngredient<TomatoOn, TopBunOn> ("TopBun")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment