packages feed

pez-0.0.4: pez.cabal

Name:                pez
Version:             0.0.4
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:
                     .
                     > -- 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.
 

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.lhs, 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