<meta name="viewport" content="width=device-width">
<script id="jsbin-javascript">
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var compose = function compose() {
for (var _len = arguments.length, fns = Array(_len), _key = 0; _key < _len; _key++) {
fns[_key] = arguments[_key];
return fns.reduce(function (composed, f) {
var oneSecond = function oneSecond() {
var getCurrentTime = function getCurrentTime() {
var clear = function clear() {
var log = function log(message) {
return console.log(message);
var serializeClockTime = function serializeClockTime(date) {
minutes: date.getMinutes(),
seconds: date.getSeconds()
var civilianHours = function civilianHours(clockTime) {
return _extends({}, clockTime, {
hours: clockTime.hours > 12 ? clockTime.hours - 12 : clockTime.hours
var appendAMPM = function appendAMPM(clockTime) {
return _extends({}, clockTime, {
ampm: clockTime.hours >= 12 ? 'PM' : 'AM'
var display = function display(target) {
var formatClock = function formatClock(format) {
return format.replace('hh', time.hours).replace('mm', time.minutes).replace('ss', time.seconds).replace('tt', time.ampm);
var prependZero = function prependZero(key) {
return function (clockTime) {
return _extends({}, clockTime, _defineProperty({}, key, clockTime[key] < 10 ? '0' + clockTime[key] : clockTime[key]));
var convertToCivilianTime = function convertToCivilianTime(clockTime) {
return compose(appendAMPM, civilianHours)(clockTime);
var doubleDigits = function doubleDigits(civilianTime) {
return compose(prependZero('hours'), prependZero('minutes'), prependZero('seconds'))(civilianTime);
var startTicking = function startTicking() {
return setInterval(compose(clear, getCurrentTime, serializeClockTime, convertToCivilianTime, doubleDigits, formatClock('hh:mm:ss tt'), display(log)), oneSecond());
log(civilianHours(serializeClockTime(getCurrentTime())));
<script id="jsbin-source-javascript" type="text/javascript">const compose = (...fns) =>
(composed, f) => f(composed),
const oneSecond = () => 1000;
const getCurrentTime = () => new Date();
const clear = () => console.clear();
const log = message => console.log(message);
const serializeClockTime = date =>
minutes: date.getMinutes(),
seconds: date.getSeconds()
const civilianHours = clockTime =>
hours: (clockTime.hours > 12) ?
const appendAMPM = clockTime =>
ampm: (clockTime.hours >= 12) ? 'PM' : 'AM'
const display = target => time => target(time);
const formatClock = format =>
format.replace('hh', time.hours)
.replace('mm', time.minutes)
.replace('ss', time.seconds)
.replace('tt', time.ampm);
const prependZero = key => clockTime =>
[key]: (clockTime[key] < 10) ?
const convertToCivilianTime = clockTime =>
const doubleDigits = civilianTime =>
const startTicking = () =>
formatClock('hh:mm:ss tt'),
log(civilianHours(serializeClockTime(getCurrentTime())))</script></body>