Docs typo
[list-fusion-probe.git] / Data / List / Fusion / Probe.hs
1 {- |
2    Copyright  : Copyright (C) 2014 Joachim Breitner
3    License    : BSD3
4
5    Maintainer : Joachim Breitner <mail@joachim-breitner.de>
6    Stability  : stable
7    Portability: GHCspecific
8 -}
9
10 module Data.List.Fusion.Probe where
11
12
13 import GHC.Exts (build, augment)
14
15 -- | This function can be wrapped around a list that should be compiled away by
16 -- list fusion. If it does, this function will disappear. If not, it will throw
17 -- an error at runtime.
18 --
19 -- > main = print $ foldr (+) 0 (fuseThis [0..1000])
20 --
21 -- Will print @Test: fuseList: List did not fuse@, while
22 --
23 -- > main = print $ foldl (+) 0 (fuseThis [0..1000])
24 --
25 -- will print @500500@.
26
27 fuseThis :: [a] -> [a]
28 fuseThis = id
29
30 {-# NOINLINE fuseThis #-}
31
32 {-# RULES
33 "fold/fuseThis/build" [~0]
34     forall k z (g::forall b. (a->b->b) -> b -> b) .
35     foldr k z (fuseThis (build g)) = g k z
36
37 "foldr/fuseThis/augment" [~0]
38     forall k z xs (g::forall b. (a->b->b) -> b -> b) .
39     foldr k z (fuseThis (augment g xs)) = g k (foldr k z xs)
40  #-}
41
42 {-# RULES
43 "fuseThis/fail" [0]
44     fuseThis = error "fuseThis: List did not fuse"
45  #-}
46