pez: A Potentially-Excellent Zipper library

[ bsd3, data, library ] [ Propose Tags ]

PEZ is a generic zipper library. It uses lenses from the fclabels package to reference a "location" to move to in the zipper. The zipper is restricted to types in the Typeable class, allowing the user to "move up" through complex data structures such as mutually-recursive types.

Both the Typeable class and fclabels lenses can be derived in GHC, making it easy for the programmer to use a zipper with a minimum of boilerplate.

First import the library, which brings in the Typeable and fclabels modules. You will also want to enable a few extensions:

-- Put these in a LANGUAGE pragma:
-- TemplateHaskell, DeriveDataTypeable, TypeOperators
module Main where

import Data.Typeable.Zipper

Create a datatype, deriving an instance of the Typeable class, and generate a lens using functions from fclabels:

data Tree a = Node {
    _leftNode :: Tree a
  , _val      :: a
  , _rightNode :: Tree a }
  | Nil
  deriving (Typeable,Show)

$(mkLabelsNoTypes [''Tree])

Now we can go crazy using Tree in a Zipper:

treeBCD = Node (Node Nil 'b' Nil) 'c' (Node Nil 'd' Nil)

descendLeft :: Zipper1 (Tree a) -> Zipper1 (Tree a)
descendLeft z = case (viewf z) of
                     Nil -> z
                     _   -> descendLeft $ moveTo leftNode z

insertLeftmost :: a -> Tree a -> Tree a
insertLeftmost x = close . setL focus x . descendLeft . zipper

treeABCD = insertLeftmost 'a' treeBCD

Because of the flexibility of fclabels, this zipper library can be used to express moving about in reversible computations simply by defining such a lens, for instance:

stringRep :: (Show b, Read b) => b :-> String
stringRep = lens show (const . read)

Please send any feature requests or bug reports along.

Modules

[Index]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.0.1, 0.0.2, 0.0.3, 0.0.4, 0.1.0
Dependencies base (>=4 && <5), fclabels (>=0.11.1.1 && <0.12), thrist (>=0.2 && <0.3) [details]
License BSD-3-Clause
Copyright Brandon Simmons, 2011
Author Brandon Simmons
Maintainer brandon.m.simmons@gmail.com
Category Data
Home page http://coder.bsimmons.name/blog/2011/04/pez-zipper-library-released/
Uploaded by BrandonSimmons at 2011-04-28T00:28:30Z
Distributions
Reverse Dependencies 1 direct, 0 indirect [details]
Downloads 3560 total (15 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]