uniplate-1.6.12: Help writing simple, concise and fast generic operations.

Safe HaskellNone

Data.Generics.Uniplate.Zipper

Contents

Description

A zipper is a structure for walking a value and manipulating it in constant time.

This module was inspired by the paper: Michael D. Adams. Scrap Your Zippers: A Generic Zipper for Heterogeneous Types, Workshop on Generic Programming 2010.

Synopsis

Create a zipper and get back the value

data Zipper from to Source

Zipper structure, whose root type is the first type argument, and whose focus type is the second type argument.

Instances

(Eq from, Eq to) => Eq (Zipper from to) 

zipper :: Uniplate to => to -> Zipper to toSource

Create a zipper, focused on the top-left value.

zipperBi :: Biplate from to => from -> Maybe (Zipper from to)Source

Create a zipper with a different focus type from the outer type. Will return Nothing if there are no instances of the focus type within the original value.

fromZipper :: Zipper from to -> fromSource

From a zipper take the whole structure, including any modifications.

Navigate within a zipper

left :: Zipper from to -> Maybe (Zipper from to)Source

Move one step left from the current position.

right :: Zipper from to -> Maybe (Zipper from to)Source

Move one step right from the current position.

up :: Zipper from to -> Maybe (Zipper from to)Source

Move one step up from the current position.

down :: Uniplate to => Zipper from to -> Maybe (Zipper from to)Source

Move one step down from the current position.

Manipulate the zipper hole

hole :: Zipper from to -> toSource

Retrieve the current focus of the zipper..

replaceHole :: to -> Zipper from to -> Zipper from toSource

Replace the value currently at the focus of the zipper.