packages feed

idris-0.9.0: src/Idris/Transforms.hs

{-# LANGUAGE PatternGuards #-}

module Idris.Transforms where

import Idris.AbsSyntax
import Core.CaseTree
import Core.TT

class Transform a where
    transform :: (a -> a) -> a -> a

instance Transform (TT Name) where
    transform t x = t (trans' x) where
        trans' (Bind n b sc) = Bind n (fmap (transform t) b) (transform t sc)
        trans' (App f a) = App (transform t f) (transform t a)
        trans' x = x

type TTOpt = TT Name -> TT Name

optimisations :: [TTOpt]
optimisations = [zero, suc]

instance Transform SC where
    transform t x = t (trans' x) where
        trans' (Case n alts) = Case n (map transAlt alts)
        trans' t = t

        transAlt (ConCase n i as sc) = ConCase n i as (trans' sc)
        transAlt (ConstCase c sc) = ConstCase c (trans' sc)
        transAlt (DefaultCase sc) = DefaultCase (trans' sc)

type CaseOpt = SC -> SC

zero :: TTOpt
zero (P _ n _) | n == NS (UN "O") ["nat","prelude"] 
    = Constant (BI 0)
zero x = x

suc :: TTOpt
suc (App (P _ s _) a) | s == NS (UN "S") ["nat","prelude"] 
    = mkApp (P Ref (UN "prim__addBigInt") Erased) [Constant (BI 1), a]
suc x = x