Safe Haskell | Safe-Infered |
---|
The Zipper is a data structure which maintains a location in a tree, and allows O(1) movement and local changes (to be more precise, in our case it is O(k) where k is the number of children of the node at question; typically this is a very small number).
- type Node f = Either (Mu f) (Path f)
- data Path f
- data Loc f = Loc {}
- root :: Mu f -> Loc f
- defocus :: Traversable f => Loc f -> Mu f
- locations :: Traversable f => Mu f -> Attr f (Loc f)
- locationsList :: Traversable f => Mu f -> [Loc f]
- locForget :: Functor f => Loc (Ann f a) -> Loc f
- extract :: Loc f -> Mu f
- replace :: Mu f -> Loc f -> Loc f
- modify :: (Mu f -> Mu f) -> Loc f -> Loc f
- moveDown :: Traversable f => Int -> Loc f -> Maybe (Loc f)
- moveDownL :: Traversable f => Loc f -> Maybe (Loc f)
- moveDownR :: Traversable f => Loc f -> Maybe (Loc f)
- moveUp :: Traversable f => Loc f -> Maybe (Loc f)
- moveRight :: Traversable f => Loc f -> Maybe (Loc f)
- moveLeft :: Traversable f => Loc f -> Maybe (Loc f)
- isTop :: Loc f -> Bool
- isBottom :: Traversable f => Loc f -> Bool
- isLeftmost :: Traversable f => Loc f -> Bool
- isRightmost :: Traversable f => Loc f -> Bool
- horizontalPos :: Foldable f => Loc f -> Int
- fullPathDown :: Foldable f => Loc f -> [Int]
- fullPathUp :: Foldable f => Loc f -> [Int]
- moveTop :: Traversable f => Loc f -> Loc f
- leftmost :: Traversable f => Loc f -> Loc f
- rightmost :: Traversable f => Loc f -> Loc f
- unsafeMoveDown :: Traversable f => Int -> Loc f -> Loc f
- unsafeMoveDownL :: Traversable f => Loc f -> Loc f
- unsafeMoveDownR :: Traversable f => Loc f -> Loc f
- unsafeMoveUp :: Traversable f => Loc f -> Loc f
- unsafeMoveLeft, unsafeMoveRight :: Traversable f => Loc f -> Loc f
Types
The context or path type. The invariant we must respect is that there is exactly
one child with the Right
constructor.
The zipper type itself, which encodes a locations in thre tree Mu f
.
Converting to and from zippers
defocus :: Traversable f => Loc f -> Mu fSource
Restores a tree from a zipper.
locations :: Traversable f => Mu f -> Attr f (Loc f)Source
We attribute all nodes with a zipper focused at that location.
locationsList :: Traversable f => Mu f -> [Loc f]Source
The list of all locations.
Manipulating the subtree at focus
Safe movements
moveDown :: Traversable f => Int -> Loc f -> Maybe (Loc f)Source
Moves down to the child with the given index.
The leftmost children has index 0
.
Testing for borders
isBottom :: Traversable f => Loc f -> BoolSource
Checks whether we cannot move down.
isLeftmost :: Traversable f => Loc f -> BoolSource
isRightmost :: Traversable f => Loc f -> BoolSource
Location queries
horizontalPos :: Foldable f => Loc f -> IntSource
Gives back the index of the given location among the children of its parent. Indexing starts from zero. In case of root node (no parent), we also return zero.
fullPathDown :: Foldable f => Loc f -> [Int]Source
We return the full path from the root as a sequence of child indices. This means that
loc == foldl (flip unsafeMoveDown) (moveTop loc) (fullPathDown loc)
fullPathUp :: Foldable f => Loc f -> [Int]Source
The following equations hold for fullPathUp
and fullPathDown
:
fullPathUp == reverse . fullPathDown loc == foldr unsafeMoveDown (moveTop loc) (fullPathUp loc)
Compound movements
moveTop :: Traversable f => Loc f -> Loc fSource
Moves to the top, by repeatedly moving up.
leftmost :: Traversable f => Loc f -> Loc fSource
Moves left until it can. It should be faster than repeated left steps.
rightmost :: Traversable f => Loc f -> Loc fSource
Moves right until it can. It should be faster than repeated right steps.
Unsafe movements
unsafeMoveDown :: Traversable f => Int -> Loc f -> Loc fSource
unsafeMoveDownL :: Traversable f => Loc f -> Loc fSource
unsafeMoveDownR :: Traversable f => Loc f -> Loc fSource
unsafeMoveUp :: Traversable f => Loc f -> Loc fSource
unsafeMoveLeft, unsafeMoveRight :: Traversable f => Loc f -> Loc fSource