enumerate-function-0.0.0: sources/Enumerate/Function.hs
{-|
e.g.
1. given:
@
data Edit = Edit Action Slice Region
deriving (Show,Read,Eq,Ord,Generic,Enumerable)
data Action
= Transpose
| Copy
| Delete
deriving (Show,Read,Eq,Ord,Enum,Bounded,Generic,Enumerable)
data Slice
= Whole
| Backwards
| Forwards
deriving (Show,Read,Eq,Ord,Enum,Bounded,Generic,Enumerable)
data Region
= Character
| Token
| Line
deriving (Show,Read,Eq,Ord,Enum,Bounded,Generic,Enumerable)
@
we can enumerate every possible editing action:
@
> 'enumerated' :: [Edit]
@
2. given a mapping to keyboard shortcuts within emacs:
@
type KeyBinding = [String]
emacsEdit :: Edit -> KeyBinding
@
the `enumerate-function` package can:
* verify that @emacsEdit@ doesn't map different editing actions
to the same keybindings, which would mean that one would shadow the other
i.e. it has no collisions; i.e. it's is injective.
* TODO verify that @emacsEdit@ maps every editing action to some keybinding,
which asserts that the relevant application supports `Edit`ing in its entirety.
(e.g. `Emacs` can, `Chrome` can't); i.e. it's is surjective.
* detect whether @emacsEdit@ is actually total; i.e.
free of bottoms. Haskell's exhaustivity checker (enable `-Wall`) can verify the
totality of @emacsEdit@, assuming no partial functions.
* serialize @emacsEdit@ into a mapping,
from which `elisp` source can be extracted.
(also see the source of "Enumerate.Function.Example")
-}
module Enumerate.Function
( module Enumerate.Function.Types
, module Enumerate.Function.Reify
, module Enumerate.Function.Map
, module Enumerate.Function.Invert
) where
import Enumerate.Function.Types
import Enumerate.Function.Reify
import Enumerate.Function.Map
import Enumerate.Function.Invert