pez: A Potentially-Excellent Zipper library
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:
{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, TypeOperators #-}
module Main where
import Data.Typeable.ZipperCreate 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' treeBCDBecause 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.
Downloads
- pez-0.0.2.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
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 |
| Uploaded | by BrandonSimmons at 2011-04-19T20:04:59Z |
| Category | Data |
| Home page | http://coder.bsimmons.name/blog/2011/04/pez-zipper-library-released/ |
| Distributions | |
| Reverse Dependencies | 1 direct, 0 indirect [details] |
| Downloads | 3781 total (22 in the last 30 days) |
| Rating | (no votes yet) [estimated by Bayesian average] |
| Your Rating | |
| Status | Docs not available [build log] All reported builds failed as of 2016-12-28 [all 7 reports] |