More sophisticated makeFromYear function, that accepts floats
This commit is contained in:
parent
f1d2a1a12f
commit
fff2f5da59
|
@ -7,7 +7,7 @@ let dateDispatch = (call: ExpressionValue.functionCall, env: DistributionOperati
|
||||||
switch call {
|
switch call {
|
||||||
| ("toString", [EvDate(t)]) => EvString(E.Date.toString(t))->Ok->Some
|
| ("toString", [EvDate(t)]) => EvString(E.Date.toString(t))->Ok->Some
|
||||||
| ("makeDateFromYear", [EvNumber(year)]) =>
|
| ("makeDateFromYear", [EvNumber(year)]) =>
|
||||||
switch E.Date.makeWithYear(Belt.Float.toInt(year)) {
|
switch E.Date.makeFromYear(year) {
|
||||||
| Ok(t) => EvDate(t)->Ok->Some
|
| Ok(t) => EvDate(t)->Ok->Some
|
||||||
| Error(e) => RETodo(e)->Error->Some
|
| Error(e) => RETodo(e)->Error->Some
|
||||||
}
|
}
|
||||||
|
|
|
@ -873,18 +873,6 @@ module Date = {
|
||||||
type t = Js.Date.t
|
type t = Js.Date.t
|
||||||
let toFloat = Js.Date.getTime
|
let toFloat = Js.Date.getTime
|
||||||
let getFullYear = Js.Date.getFullYear
|
let getFullYear = Js.Date.getFullYear
|
||||||
|
|
||||||
//The Js.Date.makeWithYM function accepts a float, but only treats it as a whole number.
|
|
||||||
//Our version takes an integer to make this distinction clearer.
|
|
||||||
let makeWithYear = (y: int): result<t, string> => {
|
|
||||||
if y < 100 {
|
|
||||||
Error("Year must be over 100")
|
|
||||||
} else if y > 200000 {
|
|
||||||
Error("Year must be less than 200000")
|
|
||||||
} else {
|
|
||||||
Ok(Js.Date.makeWithYM(~year=Belt.Float.fromInt(y), ~month=0.0, ()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let toString = Js.Date.toDateString
|
let toString = Js.Date.toDateString
|
||||||
let fromFloat = Js.Date.fromFloat
|
let fromFloat = Js.Date.fromFloat
|
||||||
let fmap = (t: t, fn: float => float) => t->toFloat->fn->fromFloat
|
let fmap = (t: t, fn: float => float) => t->toFloat->fn->fromFloat
|
||||||
|
@ -899,4 +887,22 @@ module Date = {
|
||||||
}
|
}
|
||||||
let addDuration = (t: t, duration: Duration.t) => fmap(t, t => t +. duration)
|
let addDuration = (t: t, duration: Duration.t) => fmap(t, t => t +. duration)
|
||||||
let subtractDuration = (t: t, duration: Duration.t) => fmap(t, t => t -. duration)
|
let subtractDuration = (t: t, duration: Duration.t) => fmap(t, t => t -. duration)
|
||||||
|
//The Js.Date.makeWithYM function accepts a float, but only treats it as a whole number.
|
||||||
|
//Our version takes an integer to make this distinction clearer.
|
||||||
|
let makeWithYearInt = (y: int): result<t, string> => {
|
||||||
|
if y < 100 {
|
||||||
|
Error("Year must be over 100")
|
||||||
|
} else if y > 200000 {
|
||||||
|
Error("Year must be less than 200000")
|
||||||
|
} else {
|
||||||
|
Ok(Js.Date.makeWithYM(~year=Belt.Float.fromInt(y), ~month=0.0, ()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let makeFromYear = (year: float): result<t, string> => {
|
||||||
|
let floor = year -> Js.Math.floor_float
|
||||||
|
makeWithYearInt(Belt.Float.toInt(floor))->R2.fmap(earlyDate => {
|
||||||
|
let diff = year -. floor
|
||||||
|
earlyDate->addDuration(diff *. Duration.year)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user