Skip to content

Instantly share code, notes, and snippets.

@Daymannovaes
Created July 25, 2019 22:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Daymannovaes/38e0d4511b41f7e5131bf7c0ff2fd83d to your computer and use it in GitHub Desktop.
Save Daymannovaes/38e0d4511b41f7e5131bf7c0ff2fd83d to your computer and use it in GitHub Desktop.
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();
}
@Daymannovaes
Copy link
Author

Daymannovaes commented Jul 25, 2019

given a sleep variable, which is an array of all your sleep-time start, in unix time, use calculateAverageFrom(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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment