@colisweb/rescript-toolkit 2.8.0 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -169,14 +169,18 @@ module UnitMeasure = {
|
|
|
169
169
|
let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Dimension.t> = json =>
|
|
170
170
|
switch Decco.stringFromJson(json) {
|
|
171
171
|
| Belt.Result.Ok(v) =>
|
|
172
|
-
let valueUnitArray = v
|
|
173
|
-
switch
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
| Some("
|
|
178
|
-
|
|
|
179
|
-
|
|
|
172
|
+
let valueUnitArray = v->Js.String2.split(" ")
|
|
173
|
+
switch (
|
|
174
|
+
valueUnitArray[0]->Belt.Option.flatMap(Belt.Float.fromString),
|
|
175
|
+
valueUnitArray[1],
|
|
176
|
+
) {
|
|
177
|
+
| (Some(v), Some("mm")) => #mm(v)->Ok
|
|
178
|
+
| (Some(v), Some("cm")) => #cm(v)->Ok
|
|
179
|
+
| (Some(v), Some("dm")) => #dm(v)->Ok
|
|
180
|
+
| (Some(v), Some("km")) => #km(v)->Ok
|
|
181
|
+
| (None, _) => Decco.error("unhandled no value", json)
|
|
182
|
+
| (_, None) => Decco.error("unhandled no unit", json)
|
|
183
|
+
| (_, Some(_)) => Decco.error("unhandled dimension unit", json)
|
|
180
184
|
}
|
|
181
185
|
| Belt.Result.Error(_) as err => err
|
|
182
186
|
}
|
|
@@ -233,12 +237,16 @@ module UnitMeasure = {
|
|
|
233
237
|
let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Weight.t> = json =>
|
|
234
238
|
switch Decco.stringFromJson(json) {
|
|
235
239
|
| Ok(v) =>
|
|
236
|
-
let valueUnitArray = v
|
|
237
|
-
switch
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
|
240
|
+
let valueUnitArray = v->Js.String2.split(" ")
|
|
241
|
+
switch (
|
|
242
|
+
valueUnitArray[0]->Belt.Option.flatMap(Belt.Float.fromString),
|
|
243
|
+
valueUnitArray[1],
|
|
244
|
+
) {
|
|
245
|
+
| (Some(v), Some("g")) => #g(v)->Ok
|
|
246
|
+
| (Some(v), Some("kg")) => #kg(v)->Ok
|
|
247
|
+
| (None, _) => Decco.error("unhandled no value", json)
|
|
248
|
+
| (_, None) => Decco.error("unhandled no unit", json)
|
|
249
|
+
| (_, Some(_)) => Decco.error("unhandled weight unit", json)
|
|
242
250
|
}
|
|
243
251
|
|
|
244
252
|
| Error(_) as err => err
|
|
@@ -282,6 +290,74 @@ module UnitMeasure = {
|
|
|
282
290
|
let convert = Toolkit__Utils_UnitMeasure.Weight.makeKg
|
|
283
291
|
})
|
|
284
292
|
}
|
|
293
|
+
|
|
294
|
+
module Time = {
|
|
295
|
+
module WithUnit = {
|
|
296
|
+
let encoder: Decco.encoder<Toolkit__Utils_UnitMeasure.Time.t> = value =>
|
|
297
|
+
switch value {
|
|
298
|
+
| #min(v) => Js.Json.string(v->Js.Float.toString ++ " min")
|
|
299
|
+
| #h(v) => Js.Json.string(v->Js.Float.toString ++ " h")
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Time.t> = json =>
|
|
303
|
+
switch Decco.stringFromJson(json) {
|
|
304
|
+
| Ok(v) =>
|
|
305
|
+
let valueUnitArray = v->Js.String2.split(" ")
|
|
306
|
+
switch (
|
|
307
|
+
valueUnitArray[0]->Belt.Option.flatMap(Belt.Float.fromString),
|
|
308
|
+
valueUnitArray[1],
|
|
309
|
+
) {
|
|
310
|
+
| (Some(v), Some("min")) => #min(v)->Ok
|
|
311
|
+
| (Some(v), Some("h")) => #h(v)->Ok
|
|
312
|
+
| (None, _) => Decco.error("unhandled no value", json)
|
|
313
|
+
| (_, None) => Decco.error("unhandled no unit", json)
|
|
314
|
+
| (_, Some(_)) => Decco.error("unhandled time unit", json)
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
| Error(_) as err => err
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
let codec: Decco.codec<Toolkit__Utils_UnitMeasure.Time.t> = (encoder, decoder)
|
|
321
|
+
|
|
322
|
+
@decco
|
|
323
|
+
type t = @decco.codec(codec) Toolkit__Utils_UnitMeasure.Time.t
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
module type TimeConfig = {
|
|
327
|
+
let convert: float => Toolkit__Utils_UnitMeasure.Time.t
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
module Make = (C: TimeConfig) => {
|
|
331
|
+
type time = Toolkit__Utils_UnitMeasure.Time.t
|
|
332
|
+
|
|
333
|
+
let encoder: Decco.encoder<Toolkit__Utils_UnitMeasure.Time.t> = value =>
|
|
334
|
+
switch value {
|
|
335
|
+
| #min(v) => Js.Json.string(v->Js.Float.toString ++ " min")
|
|
336
|
+
| #h(v) => Js.Json.string(v->Js.Float.toString ++ " h")
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Time.t> = json =>
|
|
340
|
+
switch Decco.floatFromJson(json) {
|
|
341
|
+
| Ok(v) => v->C.convert->Ok
|
|
342
|
+
| Error(_) as err => err
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
let codec: Decco.codec<time> = (encoder, decoder)
|
|
346
|
+
|
|
347
|
+
let toValue = Toolkit__Utils_UnitMeasure.Time.toValue
|
|
348
|
+
let display = Toolkit__Utils_UnitMeasure.Time.display
|
|
349
|
+
|
|
350
|
+
@decco
|
|
351
|
+
type t = @decco.codec(codec) Toolkit__Utils_UnitMeasure.Time.t
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
module Min = Make({
|
|
355
|
+
let convert = Toolkit__Utils_UnitMeasure.Time.makeMin
|
|
356
|
+
})
|
|
357
|
+
module H = Make({
|
|
358
|
+
let convert = Toolkit__Utils_UnitMeasure.Time.makeH
|
|
359
|
+
})
|
|
360
|
+
}
|
|
285
361
|
}
|
|
286
362
|
|
|
287
363
|
// StringArray
|
|
@@ -17,6 +17,57 @@ module Weight = {
|
|
|
17
17
|
let makeKg = (value: float) => #kg(value)
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
module Time = {
|
|
21
|
+
type t = [#min(float) | #h(float)]
|
|
22
|
+
|
|
23
|
+
let toValue = value =>
|
|
24
|
+
switch value {
|
|
25
|
+
| #min(v)
|
|
26
|
+
| #h(v) => v
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type separator = [#units | #colon]
|
|
30
|
+
let display = (value, ~separator=#units, ()) => {
|
|
31
|
+
let _initialDate = Js.Date.make()
|
|
32
|
+
let duration = switch value {
|
|
33
|
+
| #min(v) =>
|
|
34
|
+
BsDateFns.intervalToDuration(
|
|
35
|
+
~interval={
|
|
36
|
+
start: _initialDate,
|
|
37
|
+
end_: _initialDate->BsDateFns.addMinutes(v),
|
|
38
|
+
},
|
|
39
|
+
)
|
|
40
|
+
| #h(v) =>
|
|
41
|
+
BsDateFns.intervalToDuration(
|
|
42
|
+
~interval={start: _initialDate, end_: _initialDate->BsDateFns.addHours(v)},
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let mainSeparator = {
|
|
47
|
+
switch separator {
|
|
48
|
+
| #units => " h "
|
|
49
|
+
| #colon => ":"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
let secondarySeparator = {
|
|
53
|
+
switch separator {
|
|
54
|
+
| #units => " min"
|
|
55
|
+
| #colon => ""
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
switch (duration.hours, duration.minutes) {
|
|
60
|
+
| (Some(h), Some(min)) =>
|
|
61
|
+
`${h->Int.toString}${mainSeparator}${min->Int.toString}${secondarySeparator}`
|
|
62
|
+
| (Some(h), _) => `${h->Int.toString} h`
|
|
63
|
+
| (_, Some(min)) => `${min->Int.toString} min`
|
|
64
|
+
| _ => ""
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
let makeMin = (value: float) => #min(value)
|
|
68
|
+
let makeH = (value: float) => #h(value)
|
|
69
|
+
}
|
|
70
|
+
|
|
20
71
|
module Dimension = {
|
|
21
72
|
type t = [
|
|
22
73
|
| #mm(float)
|
|
@@ -60,6 +60,8 @@ external setSeconds: (Js.Date.t, float) => Js.Date.t = "setSeconds"
|
|
|
60
60
|
@module("date-fns")
|
|
61
61
|
external setMinutes: (Js.Date.t, float) => Js.Date.t = "setMinutes"
|
|
62
62
|
@module("date-fns")
|
|
63
|
+
external addMinutes: (Js.Date.t, float) => Js.Date.t = "addMinutes"
|
|
64
|
+
@module("date-fns")
|
|
63
65
|
external setHours: (Js.Date.t, float) => Js.Date.t = "setHours"
|
|
64
66
|
@module("date-fns")
|
|
65
67
|
external addHours: (Js.Date.t, float) => Js.Date.t = "addHours"
|