Front-End Analogies: Closure's Coffee — Recursion
Tags: javascript, webdev, programming, beginners
Published: 2019-07-24 15:34:33

---
title: Front-End Analogies: Closure's Coffee — Recursion
published: true
description: Explaining programming concepts through more-tangible examples.
tags: javascript, webdev, programming, beginners
cover_image: https://i.imgur.com/jXlBDH5.jpg
series: Closure's Coffee
---

### Cleaning Shop
#### Recursion
Jack is a clean freak. Leave him unattended, and the whole place will be spotless. Great and all, but, uh, we're actually trying to sell coffee here.

Over time, we've gotten a good estimate of how long it'll take him to do his tasks. Give him a hard time limit and neither one of us will be driven up a wall. Or murdered.

```javascript

"use strict";

const timeLimit = 45;
const cleaningTasks = [15, 10, 8, 5, 3, 25, 7];
const tasksCompleted = [];

// Jack's thinking: "I've only got 45 minutes?!"
// "I'll just go down the list, one by one."

const jackCleaning = (_tasks) => {
    return (_timeLimit) => {
        return (_tasksCompleted) => {
            console.log('_tasks', _tasks);

            let taskTimeChecker = _tasks.find(task => task <= _timeLimit);
            // "Find the first one, get it done."

            console.log('taskTimeChecker', taskTimeChecker);

            if (taskTimeChecker != undefined) {
                _timeLimit -= taskTimeChecker;
                console.log('_timeLimit', _timeLimit);
                // "Runnin' out of time."

                _tasksCompleted.push(taskTimeChecker);
                console.log('_tasksCompleted', _tasksCompleted);
                // "Another one bites the dust."

                _tasks.splice(_tasks.indexOf(taskTimeChecker), 1);
                // "Check that one off the list."
            }
            else {
                console.log(_tasksCompleted);
                return `_tasksCompleted: ${_tasksCompleted}`;
            }
            
            return jackCleaning(_tasks)(_timeLimit)(_tasksCompleted);
            // "All play and no work makes Jack a dull boy."
            // And he just keeps going down the list like a madman.
        }
    }
}

console.log( jackCleaning(cleaningTasks)(timeLimit)(tasksCompleted) );

// "_tasks" [15, 10, 8, 5, 3, 25, 7]
// "taskTimeChecker" 15
// "_timeLimit" 30
// "_tasksCompleted" [15]

// He's done one 15-minute task, and has 30 minutes left…

// "_tasks" [10, 8, 5, 3, 25, 7]
// "taskTimeChecker" 10
// "_timeLimit" 20
// "_tasksCompleted" [15, 10]


// "_tasks" [8, 5, 3, 25, 7]
// "taskTimeChecker" 8
// "_timeLimit" 12
// "_tasksCompleted" [15, 10, 8]


// "_tasks" [5, 3, 25, 7]
// "taskTimeChecker" 5
// "_timeLimit" 7
// "_tasksCompleted" [15, 10, 8, 5]


// "_tasks" [3, 25, 7]
// "taskTimeChecker" 3
// "_timeLimit" 4
// "_tasksCompleted" [15, 10, 8, 5, 3]


// "_tasks" [25, 7]
// "taskTimeChecker" undefined
// [15, 10, 8, 5, 3]
// "_tasksCompleted: 15,10,8,5,3"

// With only 4 minutes left, neither one of those tasks is short enough.
// Mr. Scrubbing Bubbles has to go back to slingin' beans.

```

### Bonus Lesson!
#### Variable Names
Didn't all those examples seem real easy to follow with all 'em good names? If they weren't, I had no part in this and you never saw me.

#### On the way out, we pass a sign that says:

A. always
B. be
C. coding