-----------------------------------------------------------------------------
-- |
-- 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