yi-core-0.19.4: Yi editor core library

License | GPL-2
Maintainer | yi-devel@googlegroups.com
Stability | experimental
Portability | portable
Safe Haskell | None
Language | Haskell2010

Extensions

- Cpp
- UndecidableInstances
- MonoLocalBinds
- ScopedTypeVariables
- OverloadedStrings
- GADTs
- GADTSyntax
- TypeSynonymInstances
- FlexibleInstances
- ConstrainedClassMethods
- MultiParamTypeClasses
- FunctionalDependencies
- GeneralizedNewtypeDeriving
- ExplicitForAll

Yi.Interact

Description

This is a library of interactive processes combinators, usable to define extensible keymaps.

(Inspired by the Parsec library, written by Koen Claessen)

The processes are:

- composable: in parallel using `<|>`, in sequence using monadic bind.
- extensible: it is always possible to override a behaviour by combination of `adjustPriority` and `<|>`. (See also `<||` for a convenient combination of the two.)
- monadic: sequencing is done via monadic bind. (leveraging the whole battery of monadic tools that Haskell provides)

The processes can parse input, and write output that depends on it.

The semantics are quite obvious; only disjunction deserve a bit more explanation:

in `p = (a `<|>` b)`, what happens if `a` and `b` recognize the same input (prefix), but produce conflicting output?

- if the output is the same (as by the Eq class), then the processes (prefixes) are "merged"
- if a Write is more prioritized than the other, the one with low priority will be discarded
- otherwise, the output will be delayed until one of the branches can be discarded.
- if there is no way to disambiguate, then no output will be generated anymore. This situation can be detected by using `possibleActions` however.

Synopsis

- data I ev w a
- data P event w
  - = End
  - | (Show mid, Eq mid) => Chain (P event mid) (P mid w)
- data InteractState event w
  - = Ambiguous [(Int, w, P event w)]
  - | Waiting
  - | Dead
  - | Running w (P event w)
- class (Eq w, Monad m, Alternative m, Applicative m, MonadPlus m) => MonadInteract (m :: Type -> Type) w e | m -> w e where
  - write :: w -> m ()
  - eventBounds :: Maybe e -> Maybe e -> m e
  - adjustPriority :: Int -> m ()
- deprioritize :: MonadInteract f w e => f ()
- important :: MonadInteract f w e => f a -> f a -> f a
- (<||) :: MonadInteract f w e => f a -> f a -> f a
- (||>) :: MonadInteract f w e => f a -> f a -> f a
- option :: MonadInteract m w e => a -> m a -> m a
- oneOf :: (Ord event, MonadInteract m w event, MonadFail m) => [event] -> m event
- processOneEvent :: Eq w => P event w -> event -> ([w], P event w)
- computeState :: Eq w => P event w -> InteractState event w
- event :: (Ord event, MonadInteract m w event) => event -> m event
- events :: (Ord event, MonadInteract m w event) => [event] -> m [event]
- choice :: (MonadInteract m w e, MonadFail m) => [m a] -> m a
- mkAutomaton :: Eq w => I ev w a -> P ev w
- idAutomaton :: (Ord a, Eq a) => P a a
- runWrite :: Eq w => P event w -> [event] -> [w]
- anyEvent :: (Ord event, MonadInteract m w event) => m event
- eventBetween :: (Ord e, MonadInteract m w e) => e -> e -> m e
- accepted :: Show ev => Int -> P ev w -> [[Text]]

# Documentation

data I ev w a Source #

Interactive process description

#### Instances

Instances details

Alternative (I ev w) Source # |
Instance details Defined in Yi.Interact Methods empty :: I ev w a Source # (<|>) :: I ev w a -> I ev w a -> I ev w a Source # some :: I ev w a -> I ev w [a] Source # many :: I ev w a -> I ev w [a] Source #
Applicative (I ev w) Source # |
Instance details Defined in Yi.Interact Methods pure :: a -> I ev w a Source # (<*>) :: I ev w (a -> b) -> I ev w a -> I ev w b Source # liftA2 :: (a -> b -> c) -> I ev w a -> I ev w b -> I ev w c Source # (*>) :: I ev w a -> I ev w b -> I ev w b Source # (<*) :: I ev w a -> I ev w b -> I ev w a Source #
Functor (I event w) Source # |
Instance details Defined in Yi.Interact Methods fmap :: (a -> b) -> I event w a -> I event w b Source # (<$) :: a -> I event w b -> I event w a Source #
Monad (I event w) Source # |
Instance details Defined in Yi.Interact Methods (>>=) :: I event w a -> (a -> I event w b) -> I event w b Source # (>>) :: I event w a -> I event w b -> I event w b Source # return :: a -> I event w a Source #
Eq w => MonadPlus (I event w) Source # |
Instance details Defined in Yi.Interact Methods mzero :: I event w a Source # mplus :: I event w a -> I event w a -> I event w a Source #
MonadFail (I event w) Source # |
Instance details Defined in Yi.Interact Methods fail :: String -> I event w a Source #
Eq w => MonadInteract (I event w) w event Source # |
Instance details Defined in Yi.Interact Methods write :: w -> I event w () Source # eventBounds :: Maybe event -> Maybe event -> I event w event Source # adjustPriority :: Int -> I event w () Source #

data P event w Source #

Operational representation of a process

Constructors

End |
(Show mid, Eq mid) => Chain (P event mid) (P mid w) |

#### Instances

Instances details

(Show w, Show ev) => Show (P ev w) Source # |
Instance details Defined in Yi.Interact Methods showsPrec :: Int -> P ev w -> ShowS Source # show :: P ev w -> String Source # showList :: [P ev w] -> ShowS Source #

data InteractState event w Source #

Abstraction of the automaton state.

Constructors

Ambiguous [(Int, w, P event w)] |
Waiting |
Dead |
Running w (P event w) |

#### Instances

Instances details

Monoid (InteractState event w) Source # |
Instance details Defined in Yi.Interact Methods mempty :: InteractState event w Source # mappend :: InteractState event w -> InteractState event w -> InteractState event w Source # mconcat :: [InteractState event w] -> InteractState event w Source #
Semigroup (InteractState event w) Source # |
Instance details Defined in Yi.Interact Methods (<>) :: InteractState event w -> InteractState event w -> InteractState event w Source # sconcat :: NonEmpty (InteractState event w) -> InteractState event w Source # stimes :: Integral b => b -> InteractState event w -> InteractState event w Source #

class (Eq w, Monad m, Alternative m, Applicative m, MonadPlus m) => MonadInteract (m :: Type -> Type) w e | m -> w e where Source #

Abstraction of monadic interactive processes

Methods

write :: w -> m () Source #

Outputs a result.

eventBounds :: Maybe e -> Maybe e -> m e Source #

Consumes and returns the next character. Fails if there is no input left, or outside the given bounds.

adjustPriority :: Int -> m () Source #

#### Instances

Instances details

MonadInteract m w e => MonadInteract (StateT s m) w e Source # |
Instance details Defined in Yi.Interact Methods write :: w -> StateT s m () Source # eventBounds :: Maybe e -> Maybe e -> StateT s m e Source # adjustPriority :: Int -> StateT s m () Source #
Eq w => MonadInteract (I event w) w event Source # |
Instance details Defined in Yi.Interact Methods write :: w -> I event w () Source # eventBounds :: Maybe event -> Maybe event -> I event w event Source # adjustPriority :: Int -> I event w () Source #

deprioritize :: MonadInteract f w e => f () Source #

important :: MonadInteract f w e => f a -> f a -> f a Source #

Just like `(<||)` but in prefix form. It `deprioritize`s the second argument.

(<||) :: MonadInteract f w e => f a -> f a -> f a infixl 3 Source #

(||>) :: MonadInteract f w e => f a -> f a -> f a Source #

option :: MonadInteract m w e => a -> m a -> m a Source #

`option x p` will either parse `p` or return `x` without consuming any input.

oneOf :: (Ord event, MonadInteract m w event, MonadFail m) => [event] -> m event Source #

processOneEvent :: Eq w => P event w -> event -> ([w], P event w) Source #

computeState :: Eq w => P event w -> InteractState event w Source #

event :: (Ord event, MonadInteract m w event) => event -> m event Source #

Parses and returns the specified character.

events :: (Ord event, MonadInteract m w event) => [event] -> m [event] Source #

Parses and returns the specified list of events (lazily).

choice :: (MonadInteract m w e, MonadFail m) => [m a] -> m a Source #

Combines all parsers in the specified list.

mkAutomaton :: Eq w => I ev w a -> P ev w Source #

idAutomaton :: (Ord a, Eq a) => P a a Source #

runWrite :: Eq w => P event w -> [event] -> [w] Source #

anyEvent :: (Ord event, MonadInteract m w event) => m event Source #

eventBetween :: (Ord e, MonadInteract m w e) => e -> e -> m e Source #

accepted :: Show ev => Int -> P ev w -> [[Text]] Source #