4656b28252cb8f846ba110a1c34dd5ca58c381b1
[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 import Data.Types
30
31
32 -----------------------------------------------------------------------------
33
34
35 -- Run-time cut-off for top-down traversal with one specific type case.
36 -- This is only for illustrative purposes. 
37 -- The naive approach here is prohibitively inefficient.
38 -- 
39 everywhere1RT' :: (Data a, Data b) => (a -> a) -> b -> b
40 everywhere1RT' f t =
41   if not $ typeReachableFrom (argType f) (typeValOf t)
42    then t
43    else gmapT (everywhere1RT' f) (mkT f t)