packages feed

pez-0.0.1: pez.cabal

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