Copyright | (c) 2008--2009 Universiteit Utrecht |
---|---|

License | BSD3 |

Maintainer | generics@haskell.org |

Stability | experimental |

Portability | non-portable |

Safe Haskell | Safe |

Language | Haskell98 |

The generic zipper.

- data Loc :: (* -> *) -> ((* -> *) -> * -> *) -> (* -> *) -> * -> * where
- data family Ctx (f :: (* -> *) -> * -> *) :: * -> (* -> *) -> * -> *
- data Ctxs :: (* -> *) -> ((* -> *) -> * -> *) -> * -> (* -> *) -> * -> * where
- class HFunctor phi f => Zipper phi f where
- enter :: Zipper phi f => phi ix -> r ix -> Loc phi f r ix
- on :: (forall xi. phi xi -> r xi -> a) -> Loc phi f r ix -> a
- update :: (forall xi. phi xi -> r xi -> r xi) -> Loc phi f r ix -> Loc phi f r ix

# Locations

data Loc :: (* -> *) -> ((* -> *) -> * -> *) -> (* -> *) -> * -> * where Source #

Abstract type of locations. A location contains the current focus and its context. A location is parameterized over the family of datatypes and over the type of the complete value.

# Context frames

data family Ctx (f :: (* -> *) -> * -> *) :: * -> (* -> *) -> * -> * Source #

Abstract type of context frames. Not required for the high-level navigation functions.

# Generic zipper class

class HFunctor phi f => Zipper phi f where Source #

It is in general not necessary to use the generic navigation
functions directly. The functions listed in the ``Interface'`

section
below are more user-friendly.

cmapA :: Applicative a => (forall ix. phi ix -> r ix -> a (r' ix)) -> phi ix -> Ctx f b r ix -> a (Ctx f b r' ix) Source #

fill :: phi b -> Ctx f b r ix -> r b -> f r ix Source #

first, last :: (forall b. phi b -> r b -> Ctx f b r ix -> a) -> f r ix -> Maybe a Source #

next, prev :: (forall b. phi b -> r b -> Ctx f b r ix -> a) -> phi b -> Ctx f b r ix -> r b -> Maybe a Source #

Zipper phi U Source # | |

Zipper phi (K a) Source # | |

El phi xi => Zipper phi (I xi) Source # | |

(Constructor c, Zipper phi f) => Zipper phi (C c f) Source # | |

Zipper phi f => Zipper phi ((:>:) f xi) Source # | |

(Zipper phi f, Zipper phi g) => Zipper phi ((:*:) f g) Source # | |

(Zipper phi f, Zipper phi g) => Zipper phi ((:+:) f g) Source # | |

# Interface

enter :: Zipper phi f => phi ix -> r ix -> Loc phi f r ix Source #

Start navigating a datastructure. Returns a location that focuses the entire value and has an empty context.