moonTimes function
Convenience: moonrise/moonset/transit for a Julian Day at midnight.
jd should be at 0h UT (midnight). lat, lon in radians (lon positive west).
moonCoords is a function that returns (ra, dec, parallax) for a given JDE.
deltaT in seconds.
Returns seconds of day, or null if the Moon doesn't rise/set.
Implementation
({double rise, double transit, double set})? moonTimes(
double jd,
double lat,
double lon,
double deltaT,
double th0,
({double ra, double dec, double parallax}) Function(double jde) moonCoords) {
// Compute RA/dec at day-1, day0, day+1.
final c0 = moonCoords(jd - 1);
final c1 = moonCoords(jd);
final c2 = moonCoords(jd + 1);
final h0 = stdh0Lunar(c1.parallax);
return times(lat, lon, deltaT, h0, th0,
[c0.ra, c1.ra, c2.ra], [c0.dec, c1.dec, c2.dec]);
}