var secondsPerVerse = 0.001; function bottles(n, capitalize) { return (capitalize ? english(n).capitalize() : english(n)) + " " + maybeAddAnS("bottle", n) + " of beer"; } function drinkAlotOfBeer(numberOfBottles, actionToPerformOnVerse, depth) { var stillDrinkingBeer = true; var justReplenishedSupply = false; if (!depth) depth = 0; depth++; var takeOneDownAndPassItAround = function() { numberOfBottles--; } var thereIsNoMoreBeer = function() { return !(numberOfBottles > 0); } var replenishBeerSupply = function() { numberOfBottles = depth - 1; justReplenishedSupply = true; } var stopDrinkingBeer = function() { stillDrinkingBeer = false; } var verse = bottles(numberOfBottles, true) + " on the wall,\n" + bottles(numberOfBottles) + "!\n"; if (thereIsNoMoreBeer()) { verse += "Go to the store, buy some more,\n"; replenishBeerSupply(); stopDrinkingBeer(); } else { verse += "Take " + (numberOfBottles == 1 ? "it" : "one") + " down, pass it around,\n"; takeOneDownAndPassItAround(); } verse += bottles(numberOfBottles) + " on the wall" + (justReplenishedSupply ? "!" : "."); if (stillDrinkingBeer) { return actionToPerformOnVerse(verse, [drinkAlotOfBeer, numberOfBottles, actionToPerfor