(options: FloatOptions)
| 307 | } |
| 308 | |
| 309 | function handleProcessFloat(options: FloatOptions) { |
| 310 | return (input: Terminal.UserInput, state: State) => { |
| 311 | switch (input.key.name) { |
| 312 | case "backspace": { |
| 313 | return processBackspace(state) |
| 314 | } |
| 315 | case "k": |
| 316 | case "up": { |
| 317 | return Effect.succeed(Action.NextFrame({ |
| 318 | state: { |
| 319 | ...state, |
| 320 | value: state.value === "" || state.value === "-" |
| 321 | ? `${options.incrementBy}` |
| 322 | : `${Number.parseFloat(state.value) + options.incrementBy}`, |
| 323 | error: Option.none() |
| 324 | } |
| 325 | })) |
| 326 | } |
| 327 | case "j": |
| 328 | case "down": { |
| 329 | return Effect.succeed(Action.NextFrame({ |
| 330 | state: { |
| 331 | ...state, |
| 332 | value: state.value === "" || state.value === "-" |
| 333 | ? `-${options.decrementBy}` |
| 334 | : `${Number.parseFloat(state.value) - options.decrementBy}`, |
| 335 | error: Option.none() |
| 336 | } |
| 337 | })) |
| 338 | } |
| 339 | case "enter": |
| 340 | case "return": { |
| 341 | return Effect.matchEffect(parseFloat(state.value), { |
| 342 | onFailure: () => |
| 343 | Effect.succeed(Action.NextFrame({ |
| 344 | state: { |
| 345 | ...state, |
| 346 | error: Option.some("Must provide a floating point value") |
| 347 | } |
| 348 | })), |
| 349 | onSuccess: (n) => |
| 350 | Effect.flatMap( |
| 351 | Effect.sync(() => EffectNumber.round(n, options.precision)), |
| 352 | (rounded) => |
| 353 | Effect.match(options.validate(rounded), { |
| 354 | onFailure: (error) => |
| 355 | Action.NextFrame({ |
| 356 | state: { |
| 357 | ...state, |
| 358 | error: Option.some(error) |
| 359 | } |
| 360 | }), |
| 361 | onSuccess: (value) => Action.Submit({ value }) |
| 362 | }) |
| 363 | ) |
| 364 | }) |
| 365 | } |
| 366 | default: { |
no test coverage detected
searching dependent graphs…