duras/keyseq
1
0
Fork
You've already forked keyseq
0
Deterministic planner for human-like typing. https://ocaml.org/p/keyseq/latest
  • OCaml 97.4%
  • Dune 2.6%
2026年07月04日 05:15:19 +03:00
examples Initial commit 2026年07月04日 05:15:19 +03:00
lib Initial commit 2026年07月04日 05:15:19 +03:00
test Initial commit 2026年07月04日 05:15:19 +03:00
.gitignore Initial commit 2026年07月04日 05:15:19 +03:00
CHANGES.md Initial commit 2026年07月04日 05:15:19 +03:00
demo.gif Initial commit 2026年07月04日 05:15:19 +03:00
dune-project Initial commit 2026年07月04日 05:15:19 +03:00
keyseq.opam Initial commit 2026年07月04日 05:15:19 +03:00
LICENSE Initial commit 2026年07月04日 05:15:19 +03:00
README.md Initial commit 2026年07月04日 05:15:19 +03:00

keyseq

Deterministic planner for human-like typing. Turns a string into a sequence of typing events — insert, delete, delay, idle — for a renderer to play back.

demo

Requirements

  • OCaml ≥ 4.14 (uses String.get_utf_8_uchar).

Install

opam install keyseq

Use

let state = Random.State.make [| 1 |] in
match Keyseq.plan Keyseq.default_config state "Hello, world." with
| Ok events -> Keyseq_terminal.run events
| Error (Keyseq.Invalid_utf8 offset) ->
 Printf.eprintf "invalid UTF-8 at byte %d\n" offset

See examples/demo.ml for a complete, runnable example.

Behavior

  • Sleep is an ordinary inter-character delay. Idle is a longer pause, following a sentence-ending . ! ?, during which a renderer may animate the cursor.
  • Mid-clause punctuation (, ; : —) gets a Sleep pause only, no Idle.
  • Typos are only generated for ASCII letters and Cyrillic-block letters; nothing else is ever mistyped, regardless of typo_rate.
  • All randomness is explicit: callers pass a Random.State.t, and the library never calls Random.self_init. Same config, same unconsumed state, same input text — same output, every time.

Failure modes

  • Keyseq.plan returns Error (Invalid_utf8 offset) if the input isn't valid UTF-8. offset is a byte offset.
  • Keyseq.plan raises Invalid_argument if config violates its own preconditions (e.g. max_delay < min_delay) — this is a programmer error, not an input-validation failure.

License

ISC. See LICENSE.