Name: pez Version: 0.0.1 Synopsis: A Potentially-Excellent Zipper library Homepage: http://coder.bsimmons.name/blog/2011/04/pez-zipper-library-released/ Description: 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.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. License: BSD3 License-file: LICENSE Author: Brandon Simmons Maintainer: brandon.m.simmons@gmail.com -- A copyright notice. Copyright: Brandon Simmons, 2011 -- Stability of the pakcage (experimental, provisional, stable...) Stability: Experimental Category: Data Build-type: Simple -- Extra files to be distributed with the package, such as examples or -- a README. Extra-source-files: EXAMPLES/Examples.hs, Tests.hs -- Constraint on the version of Cabal needed to build this package. Cabal-version: >=1.2.3 Library -- Modules exported by the library. Exposed-modules: Data.Typeable.Zipper -- Packages needed in order to build this package. Build-depends: base >= 4 && < 5 , fclabels >= 0.11.1.1 && < 0.12 , thrist >= 0.2 && < 0.3 Extensions: GeneralizedNewtypeDeriving , TypeOperators , TemplateHaskell , GADTs , DeriveDataTypeable -- Modules not exported by this package. Other-modules: Data.Record.Label.Prelude