[project @ 2003-07-24 16:24:21 by ralf]
[ghc-base.git] / Data / Generics / Shortcuts.hs
1 -----------------------------------------------------------------------------
2 -- |
3 -- Module      :  Data.Generics.Shortcuts
4 -- Copyright   :  (c) The University of Glasgow, CWI 2001--2003
5 -- License     :  BSD-style (see the file libraries/base/LICENSE)
6 -- 
7 -- Maintainer  :  libraries@haskell.org
8 -- Stability   :  experimental
9 -- Portability :  non-portable
10 --
11 -- "Scrap your boilerplate" --- Generic programming in Haskell 
12 -- See <http://www.cs.vu.nl/boilerplate/>.
13 --
14 -----------------------------------------------------------------------------
15
16 module Data.Generics.Shortcuts ( 
17
18         -- * Cut-off traversal
19         everywhere1RT'
20
21   ) where
22
23 -----------------------------------------------------------------------------
24
25
26 import Data.Generics.Basics
27 import Data.Generics.Aliases
28 import Data.Generics.Types
29
30
31 -----------------------------------------------------------------------------
32
33
34 -- Run-time cut-off for top-down traversal with one specific type case.
35 -- This is only for illustrative purposes. 
36 -- The naive approach here is prohibitively inefficient.
37 -- 
38 everywhere1RT' :: (Data a, Data b) => (a -> a) -> b -> b
39 everywhere1RT' f t =
40   if not $ typeReachableFrom (argType f) (typeValOf t)
41    then t
42    else gmapT (everywhere1RT' f) (mkT f t)