packages feed

pointless-rewrite-0.0.3: src/Transform/Rules/PF.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Transform.Rules.PF
-- Copyright   :  (c) 2010 University of Minho
-- License     :  BSD3
--
-- Maintainer  :  hpacheco@di.uminho.pt
-- Stability   :  experimental
-- Portability :  non-portable
--
-- Pointless Rewrite:
-- automatic transformation system for point-free programs
-- 
-- Generic strategy for the rewriting of point-free functions.
--
-----------------------------------------------------------------------------

module Transform.Rules.PF where

import Transform.Rewriting
import Transform.Rules.PF.Combinators
import Transform.Rules.PF.Products
import Transform.Rules.PF.Sums
import Transform.Rules.PF.Dists
import Transform.Rules.PF.Rec
import Transform.Rules.PF.Lists
import Transform.Rules.PF.Monoids
import Transform.Rules.PF.Sums

sum_sfusion :: Rule
sum_sfusion = comp2 (prod_wunfusion >>> comp1 unabides) >>> comp sum_fusion'

optimise_pf :: Rule
optimise_pf = outermost rules >>> try ((once fuse1 ||| once fuse2 ||| once fuse3 ||| once fuse4 ||| once fuse5) >>> optimise_pf)
    where rules, fuse1, fuse2, fuse3, fuse4, fuse5 :: Rule
          rules = primitives ||| monoids ||| lists ||| prods ||| sums ||| bangs ||| convs ||| dists ||| recs
          fuse1 = top para_cata ||| top cata_fusion ||| top para_fusion ||| top ana_fusion ||| top cata_zero ||| top cata_cancel ||| top ana_cancel
          fuse2 = top distl_fusion ||| top distl_nat
          fuse3 = top hylo_id ||| top hylo_shift
          fuse4 = top prod_fusion ||| top sum_fusion
          fuse5 = top sum_sfusion

beautify_pf :: Rule    
beautify_pf = outermost (prods ||| sums)
   where
   prods, sums :: Rule
   prods = top prod_unfusion ||| top prod_undef
   sums = top sum_unfusion ||| top sum_undef