hjkl-vim 0.8.0

Vim modal state types and grammar primitives for the hjkl editor stack. Pre-1.0 churn.
Documentation
/// Operator identity carried by the reducer. Kept independent of
/// `hjkl-engine` so `hjkl-vim` has no upstream dependency.
///
/// Only the five operators that can be entered directly from Normal mode via
/// bare `d` / `y` / `c` / `>` / `<` are listed here. Case operators
/// (`gu` / `gU` / `g~`) and Reflow (`gq`) are deferred to chunk 2c-v;
/// Fold (`zf`) does not enter bare op-pending so it is omitted entirely.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OperatorKind {
    /// `d` — delete.
    Delete,
    /// `y` — yank.
    Yank,
    /// `c` — change (delete + enter Insert mode).
    Change,
    /// `>` — indent.
    Indent,
    /// `<` — outdent.
    Outdent,
}

impl OperatorKind {
    /// The doubled-letter char for this operator (`dd`, `yy`, `cc`, `>>`, `<<`).
    pub(crate) fn double_char(self) -> char {
        match self {
            OperatorKind::Delete => 'd',
            OperatorKind::Yank => 'y',
            OperatorKind::Change => 'c',
            OperatorKind::Indent => '>',
            OperatorKind::Outdent => '<',
        }
    }
}