Created
July 25, 2019 22:06
-
-
Save Daymannovaes/38e0d4511b41f7e5131bf7c0ff2fd83d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const dayOfMonth = d => `${d.getDate()}/${d.getMonth()}/${d.getFullYear()}`; | |
const midnightDistance = d => Math.abs(realMidnightDistance(d)); | |
const realMidnightDistance = d => (d.getHours() - 12) > 0 ? -midnightDistancePM(d) : midnightDistanceAM(d); | |
const midnightDistanceAM = d => (d.getHours() * 60) + d.getMinutes(); | |
const midnightDistancePM = d => ((24 - d.getHours()) * 60) - (60 - d.getMinutes()); | |
const excludeDistLessThan = threshold => d => realMidnightDistance(d) > threshold; | |
const closestToMidnight = d => | |
d.length === 1 ? d : d.reduce( | |
(closest, value, index) => | |
midnightDistance(value) >= closest.dist | |
? closest | |
: { value: value, dist: midnightDistance(value) }, | |
{ value: 0, dist: Infinity } // default | |
).value; | |
const earlierSleepTime = d => | |
d.length <= 1 ? d : d.reduce( | |
(closest, value, index) => | |
realMidnightDistance(value) >= closest.dist | |
? closest | |
: { value: value, dist: realMidnightDistance(value) }, | |
{ value: 0, dist: Infinity } // default | |
).value; | |
// use calculateAverageFrom(30) to get the average from 30 days ago | |
function calculateAverageFrom(days) { | |
const partial = _.chain(sleep) | |
.map(s => new Date(s)) | |
.groupBy(dayOfMonth) | |
.values() | |
.value(); | |
return _.chain(partial) | |
.slice(partial.length - days) | |
.map(d => d.filter(excludeDistLessThan(-300))) // remove nap | |
// .flatMap(closestToMidnight) | |
.map(earlierSleepTime) | |
.flatten() | |
.map(realMidnightDistance) | |
.mean() // distância média de meia noite | |
.value(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
given a
sleep
variable, which is an array of all your sleep-time start, in unix time, usecalculateAverageFrom(30)
to get the average from 30 days ago. The result is the distance (in minutes) from midnight. Negative values indicate distance before midnight (e.g.: -120 indicate that your setpoint is 10pm). Positive values indicate distance after midnight (120 indicates 2am).