packages feed

zipper-0.4: examples/ASTZipper.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs            #-}

module ASTZipper where

import Data.Maybe (fromJust)
import Control.Arrow ((>>>))
import Control.Monad ((>=>))

import AST
import ASTUse

import Generics.MultiRec.Zipper

-- | Example expression

example = Let ("x" := Mul (Const 6) (Const 9))
              (Add (EVar "x") (EVar "y"))

-- | Test for the generic zipper

testZipper :: Maybe Expr
testZipper =
    enter Expr   >>>
    down         >=>
    down         >=>
    right        >=>
    update solve >>>
    leave        >>>
    return        $  example
  where
    solve :: AST ix -> ix -> ix
    solve Expr _ = Const 42
    solve _    x = x