initial commit
commit
b048f4ad54
@ -0,0 +1,103 @@
|
|||||||
|
# Time Since
|
||||||
|
|
||||||
|
A demo of a function creating another function
|
||||||
|
|
||||||
|
## Preliminary Code
|
||||||
|
```ts
|
||||||
|
function sleep(milliseconds: number) {
|
||||||
|
const timeWhenStarted = Date.now()
|
||||||
|
let timeNow = Date.now()
|
||||||
|
while (timeNow < timeWhenStarted + milliseconds) {
|
||||||
|
timeNow = Date.now()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## First Version
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const timeSinceInitializer1 = () => {
|
||||||
|
const initialTime = Date.now()
|
||||||
|
const timeSince = () => {
|
||||||
|
const now = Date.now()
|
||||||
|
const diff = now - initialTime
|
||||||
|
const message = 'It has been ' + diff + ' ms since initialization'
|
||||||
|
console.log(message)
|
||||||
|
}
|
||||||
|
return timeSince
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The function `timeSinceInitializer1` sets the `initialTime` variable to the time when the *initializer* function was executed. Then it creates a `timeSince` function and returns that function.
|
||||||
|
|
||||||
|
Notice that the `timeSince` function is not executed, only created, so the code inside that function does not get run yet. When the `timeSince` gets executed, it sets the `now` variable to the time when the `timeSince` function is executed. Then it calculates the difference between these two times, and logs the information.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
```ts
|
||||||
|
const timeSince1 = timeSinceInitializer1()
|
||||||
|
sleep(1000)
|
||||||
|
timeSince1() // prints "It has been 1000 ms since initialization"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Second Version
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const timeSinceInitializer2 = (includeInitialTime: boolean) => {
|
||||||
|
const initialTime = Date.now()
|
||||||
|
const timeSince = () => {
|
||||||
|
const now = Date.now()
|
||||||
|
const diff = now - initialTime
|
||||||
|
let message = 'It has been ' + diff + ' ms since initialization'
|
||||||
|
if (includeInitialTime) {
|
||||||
|
const initialTimeString = new Date(initialTime).toISOString()
|
||||||
|
message = message + ` (${initialTimeString})`
|
||||||
|
}
|
||||||
|
console.log(message)
|
||||||
|
}
|
||||||
|
return timeSince
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In the second version we include a parameter to the initializer function. It is a boolean parameter. If it is set to true, the message in the `timeSince` function will include the initial time. If not, the message will be as it was in the first version.
|
||||||
|
|
||||||
|
The noteworthy thing here is that by using a parameter in the *initializer* function, we can create different kinds of result functions. When they have been created, the behaviour can not be changed.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
```ts
|
||||||
|
const timeSince = timeSinceInitializer2(true)
|
||||||
|
sleep(1000)
|
||||||
|
timeSince() // prints "It has been 1000 ms since initialization (2023-11-24T09:09:34.295Z)"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Third Version
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const timeSinceInitializer3 = (includeInitialTime) => {
|
||||||
|
const initialTime = Date.now()
|
||||||
|
const timeSince = (messagePart1 = 'It has been ', messagePart2 = ' ms since initialization') => {
|
||||||
|
const now = Date.now()
|
||||||
|
const diff = now - initialTime
|
||||||
|
let message = messagePart1 + diff + messagePart2
|
||||||
|
if (includeInitialTime) {
|
||||||
|
const initialTimeString = new Date(initialTime).toISOString()
|
||||||
|
message = message + ` (${initialTimeString})`
|
||||||
|
}
|
||||||
|
console.log(message)
|
||||||
|
}
|
||||||
|
return timeSince
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In the third version we add even more complexity by having parameters in both the initializer function and the resulting function.
|
||||||
|
|
||||||
|
The parameter in the initializer function dictates if the initial time is shown. This behaviour can not be changed when the function has been created.
|
||||||
|
|
||||||
|
The parameters in the timeSince function tell what the printed message will be. This allows us to control the behaviour of the resulting function after creation.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
```ts
|
||||||
|
const timeSince3 = timeSinceInitializer3(true)
|
||||||
|
sleep(1000)
|
||||||
|
timeSince3('Holy Cow! It has been ', ' ms since the initialization!')
|
||||||
|
// prints "Holy Cow! It has been 1001 ms since the initialization! (2023-11-24T09:13:54.369Z)"
|
||||||
|
```
|
@ -0,0 +1,72 @@
|
|||||||
|
/**
|
||||||
|
* Stops program progress for given amount of milliseconds.
|
||||||
|
*
|
||||||
|
* NOTICE: This is NOT a good way to do this!
|
||||||
|
* It is simple for a demonstration, but should not be used
|
||||||
|
* in actual programs.
|
||||||
|
*/
|
||||||
|
function sleep(milliseconds: number) {
|
||||||
|
const timeWhenStarted = Date.now()
|
||||||
|
let timeNow = Date.now()
|
||||||
|
while (timeNow < timeWhenStarted + milliseconds) {
|
||||||
|
timeNow = Date.now()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// First version
|
||||||
|
const timeSinceInitializer1 = () => {
|
||||||
|
const initialTime = Date.now()
|
||||||
|
const timeSince = () => {
|
||||||
|
const now = Date.now()
|
||||||
|
const diff = now - initialTime
|
||||||
|
const message = 'It has been ' + diff + ' ms since initialization'
|
||||||
|
console.log(message)
|
||||||
|
}
|
||||||
|
return timeSince
|
||||||
|
}
|
||||||
|
|
||||||
|
const timeSince1 = timeSinceInitializer1()
|
||||||
|
sleep(1000)
|
||||||
|
timeSince1()
|
||||||
|
|
||||||
|
|
||||||
|
// Second version
|
||||||
|
const timeSinceInitializer2 = (includeInitialTime: boolean) => {
|
||||||
|
const initialTime = Date.now()
|
||||||
|
const timeSince = () => {
|
||||||
|
const now = Date.now()
|
||||||
|
const diff = now - initialTime
|
||||||
|
let message = 'It has been ' + diff + ' ms since initialization'
|
||||||
|
if (includeInitialTime) {
|
||||||
|
const initialTimeString = new Date(initialTime).toISOString()
|
||||||
|
message = message + ` (${initialTimeString})`
|
||||||
|
}
|
||||||
|
console.log(message)
|
||||||
|
}
|
||||||
|
return timeSince
|
||||||
|
}
|
||||||
|
|
||||||
|
const timeSince2 = timeSinceInitializer2(true)
|
||||||
|
sleep(1000)
|
||||||
|
timeSince2()
|
||||||
|
|
||||||
|
// Third version
|
||||||
|
const timeSinceInitializer3 = (includeInitialTime: boolean) => {
|
||||||
|
const initialTime = Date.now()
|
||||||
|
const timeSince = (messagePart1 = 'It has been ', messagePart2 = ' ms since initialization') => {
|
||||||
|
const now = Date.now()
|
||||||
|
const diff = now - initialTime
|
||||||
|
let message = messagePart1 + diff + messagePart2
|
||||||
|
if (includeInitialTime) {
|
||||||
|
const initialTimeString = new Date(initialTime).toISOString()
|
||||||
|
message = message + ` (${initialTimeString})`
|
||||||
|
}
|
||||||
|
console.log(message)
|
||||||
|
}
|
||||||
|
return timeSince
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const timeSince3 = timeSinceInitializer3(true)
|
||||||
|
sleep(1000)
|
||||||
|
timeSince3('Holy Cow! It has been ', ' ms since the initialization!')
|
Loading…
Reference in New Issue