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