--
-- Test array fusion
--

import Char
import qualified Data.ByteString as B

main = do ps <- B.getContents

--        print $ B.length . B.map (+1) $ ps

          let f = B.map (*4) . B.map (+2) . B.map (subtract 3) . B.map (+1) . B.map (*7)
          print $ B.length (f ps)

          let g = B.filter (/=104) . B.filter (/=102) . B.filter (/=103) . B.filter (/=104)
          print $ B.length (g ps)

          let h = B.filter (/=20) . B.map (+2) . B.filter (/=107) . B.map (+8)
          print $ B.length (h ps)   -- should fuse

          let i = B.map (+2) . B.filter (/=20) . B.map (+8). B.filter (/=107)
          print $ B.length (i ps)   -- should fuse

          print $ B.length $ (B.filter (/=7) . B.map (+8)) ps -- should fuse

          print $ B.length $ B.map (+7) ps -- shouldn't fuse

          print $ B.foldl (\a _ -> a+1::Int) 0 $ B.map (+7) ps -- should fuse
