-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclock_functional.js
58 lines (47 loc) · 1.39 KB
/
clock_functional.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
const oneSecond = () => 1000;
const getCurrentTime = () => new Date();
const clear = () => console.clear();
const log = (message) => console.log(message)
const compose = (...fns) => (arg) => fns.reduce((composed, f) => f(composed), arg)
const serializeClockTime = (date) => ({
hours: date.getHours(),
minutes: date.getMinutes(),
seconds: date.getSeconds()
})
const civilianHours = (clockTime) => ({
...clockTime,
hours: (clockTime.hours > 12) ?
clockTime.hours - 12 :
clockTime.hours
})
const appendAMPM = (clockTime) => ({
...clockTime,
ampm: (clockTime.hours >= 12) ? "PM" : "AM"
})
const display = target => time => target(time)
const formatClock = format => time => format.replace("hh", time.hours).
replace("mm", time.minutes).
replace("ss", time.seconds).
replace("tt", time.ampm)
const prependZero = key => clockTime => ({
...clockTime,
[key]: (clockTime[key] < 10) ? "0" + clockTime[key] : clockTime[key]
})
const convertToCivilianTime = clockTime => compose(appendAMPM, civilianHours)(clockTime)
const doubleDigits = civilianTime => compose(
prependZero("hours"),
prependZero("minutes"),
prependZero("seconds")
)(civilianTime)
const startTicking = () => setInterval(
compose(
clear,
getCurrentTime,
serializeClockTime,
convertToCivilianTime,
doubleDigits,
formatClock("hh:mm:ss tt"),
display(log)
), oneSecond()
)
startTicking()