diff options
Diffstat (limited to 'lib/command.ml')
| -rw-r--r-- | lib/command.ml | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/lib/command.ml b/lib/command.ml index 31e2ca2..74b616a 100644 --- a/lib/command.ml +++ b/lib/command.ml | |||
| @@ -18,6 +18,7 @@ type operation = | |||
| 18 | type scope = Line | To_bol | To_eol | Down | Left | Right | Up | 18 | type scope = Line | To_bol | To_eol | Down | Left | Right | Up |
| 19 | 19 | ||
| 20 | type command = | 20 | type command = |
| 21 | | Reset | ||
| 21 | | Type of char | 22 | | Type of char |
| 22 | | Simple of Key.t | 23 | | Simple of Key.t |
| 23 | | Partial of Key.t | 24 | | Partial of Key.t |
| @@ -89,59 +90,57 @@ let is_instant_operation k = List.mem ~equal:Poly.equal instant_operation k | |||
| 89 | 90 | ||
| 90 | let n_stream = | 91 | let n_stream = |
| 91 | let step s k = | 92 | let step s k = |
| 92 | let open Sequence.Step in | ||
| 93 | match (s, k) with | 93 | match (s, k) with |
| 94 | | `start, Key '"' -> Yield { value = Partial k; state = `chord_reg_pre } | 94 | | `start, Key '"' -> (`chord_reg_pre, Partial k) |
| 95 | (* Register *) | 95 | (* Register *) |
| 96 | | `chord_reg_pre, Key c -> Yield { value = Partial k; state = `chord_reg c } | 96 | | `chord_reg_pre, Key c -> (`chord_reg c, Partial k) |
| 97 | (* Count (first) *) | 97 | (* Count (first) *) |
| 98 | | `start, Key n when Char.('1' <= n && n <= '9') -> | 98 | | `start, Key n when Char.('1' <= n && n <= '9') -> |
| 99 | let n = Char.to_int n - 48 in | 99 | let n = Char.to_int n - 48 in |
| 100 | Yield { value = Partial k; state = `chord_fst_n (None, n) } | 100 | (`chord_fst_n (None, n), Partial k) |
| 101 | | `chord_reg r, Key n when Char.('1' <= n && n <= '9') -> | 101 | | `chord_reg r, Key n when Char.('1' <= n && n <= '9') -> |
| 102 | let n = Char.to_int n - 48 in | 102 | let n = Char.to_int n - 48 in |
| 103 | Yield { value = Partial k; state = `chord_fst_n (Some r, n) } | 103 | (`chord_fst_n (Some r, n), Partial k) |
| 104 | | `chord_fst_n (r, m), Key n when Char.('0' <= n && n <= '9') -> | 104 | | `chord_fst_n (r, m), Key n when Char.('0' <= n && n <= '9') -> |
| 105 | let n = (10 * m) + Char.to_int n - 48 in | 105 | let n = (10 * m) + Char.to_int n - 48 in |
| 106 | Yield { value = Partial k; state = `chord_fst_n (r, n) } | 106 | (`chord_fst_n (r, n), Partial k) |
| 107 | (* Instant operations *) | 107 | (* Instant operations *) |
| 108 | | `start, k when is_instant_operation k -> | 108 | | `start, k when is_instant_operation k -> (`start, shortcut (to_op k)) |
| 109 | Yield { value = shortcut (to_op k); state = `start } | ||
| 110 | | `chord_reg r, k when is_instant_operation k -> | 109 | | `chord_reg r, k when is_instant_operation k -> |
| 111 | Yield { value = shortcut ~r (to_op k); state = `start } | 110 | (`start, shortcut ~r (to_op k)) |
| 112 | | `chord_fst_n (r, n), k when is_instant_operation k -> | 111 | | `chord_fst_n (r, n), k when is_instant_operation k -> |
| 113 | Yield { value = shortcut ?r ~n (to_op k); state = `start } | 112 | (`start, shortcut ?r ~n (to_op k)) |
| 114 | (* Chord operation (first) *) | 113 | (* Chord operation (first) *) |
| 115 | | `start, k when is_chord_operation k -> | 114 | | `start, k when is_chord_operation k -> |
| 116 | Yield { value = Partial k; state = `chord_cmd (None, None, to_op k) } | 115 | (`chord_cmd (None, None, to_op k), Partial k) |
| 117 | | `chord_reg r, k when is_chord_operation k -> | 116 | | `chord_reg r, k when is_chord_operation k -> |
| 118 | Yield { value = Partial k; state = `chord_cmd (Some r, None, to_op k) } | 117 | (`chord_cmd (Some r, None, to_op k), Partial k) |
| 119 | | `chord_fst_n (r, n), k when is_chord_operation k -> | 118 | | `chord_fst_n (r, n), k when is_chord_operation k -> |
| 120 | Yield { value = Partial k; state = `chord_cmd (r, Some n, to_op k) } | 119 | (`chord_cmd (r, Some n, to_op k), Partial k) |
| 121 | (* Count (second) *) | 120 | (* Count (second) *) |
| 122 | | `chord_cmd (r, n1, c), Key n when Char.('1' <= n && n <= '9') -> | 121 | | `chord_cmd (r, n1, c), Key n when Char.('1' <= n && n <= '9') -> |
| 123 | let n = Char.to_int n - 48 in | 122 | let n = Char.to_int n - 48 in |
| 124 | Yield { value = Partial k; state = `chord_snd_n (r, n1, c, n) } | 123 | (`chord_snd_n (r, n1, c, n), Partial k) |
| 125 | | `chord_snd_n (r, n1, c, n2), Key n when Char.('0' <= n && n <= '9') -> | 124 | | `chord_snd_n (r, n1, c, n2), Key n when Char.('0' <= n && n <= '9') -> |
| 126 | let n2 = (10 * n2) + Char.to_int n - 48 in | 125 | let n2 = (10 * n2) + Char.to_int n - 48 in |
| 127 | Yield { value = Partial k; state = `chord_snd_n (r, n1, c, n2) } | 126 | (`chord_snd_n (r, n1, c, n2), Partial k) |
| 128 | (* Chord operation (second) *) | 127 | (* Chord operation (second) *) |
| 129 | | `chord_cmd (r, n, c), k when is_chord_operation k && Poly.(c = to_op k) -> | 128 | | `chord_cmd (r, n, c), k when is_chord_operation k && Poly.(c = to_op k) -> |
| 130 | Yield { value = chord ?r ?n1:n c Line; state = `start } | 129 | (`start, chord ?r ?n1:n c Line) |
| 131 | | `chord_snd_n (r, n1, c, n2), k | 130 | | `chord_snd_n (r, n1, c, n2), k |
| 132 | when is_chord_operation k && Poly.(c = to_op k) -> | 131 | when is_chord_operation k && Poly.(c = to_op k) -> |
| 133 | Yield { value = chord ?r ?n1 c ~n2 Line; state = `start } | 132 | (`start, chord ?r ?n1 c ~n2 Line) |
| 134 | (* Movement *) | 133 | (* Movement *) |
| 135 | | (`start | `chord_reg _), k when is_simple_movement k -> | 134 | | (`start | `chord_reg _), k when is_simple_movement k -> |
| 136 | Yield { value = chord Noop (to_scope k); state = `start } | 135 | (`start, chord Noop (to_scope k)) |
| 137 | | `chord_fst_n (_, n), k when is_simple_movement k -> | 136 | | `chord_fst_n (_, n), k when is_simple_movement k -> |
| 138 | Yield { value = chord ~n1:n Noop (to_scope k); state = `start } | 137 | (`start, chord ~n1:n Noop (to_scope k)) |
| 139 | | `chord_cmd (r, n, c), k when is_simple_movement k -> | 138 | | `chord_cmd (r, n, c), k when is_simple_movement k -> |
| 140 | Yield { value = chord ?r ?n1:n c (to_scope k); state = `start } | 139 | (`start, chord ?r ?n1:n c (to_scope k)) |
| 141 | | `chord_snd_n (r, n1, c, n2), k when is_simple_movement k -> | 140 | | `chord_snd_n (r, n1, c, n2), k when is_simple_movement k -> |
| 142 | Yield { value = chord ?r ?n1 c ~n2 (to_scope k); state = `start } | 141 | (`start, chord ?r ?n1 c ~n2 (to_scope k)) |
| 143 | (* Catch-all rules *) | 142 | (* Catch-all rules *) |
| 144 | | `start, _ -> Yield { value = Simple k; state = `start } | 143 | | `start, _ -> (`start, Simple k) |
| 145 | | _, _ -> Skip { state = `start } | 144 | | _, _ -> (`start, Reset) |
| 146 | in | 145 | in |
| 147 | Sequence.unfold_with ~init:`start ~f:step Key.stream | 146 | Sequence.folding_map ~init:`start ~f:step Key.stream |
