summaryrefslogtreecommitdiff
path: root/Sweeten.hs
blob: 929f9f8c8b2704dc5a6809f977aa189845c88cd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{-# LANGUAGE ScopedTypeVariables #-}
module Sweeten where

import Data.Data
import Data.Generics.Aliases
import Data.Generics.Schemes
import Language.Haskell.Exts.Syntax as HS

applyDoSyntax :: forall l. (Typeable l, Data l) => Exp l -> Exp l
applyDoSyntax = everywhere (mkT (applyDoSyntax1 :: Exp l -> Exp l))

applyDoSyntax1 :: Exp l -> Exp l
applyDoSyntax1 exp@(InfixApp la x (QVarOp lb (UnQual lc (Symbol ld ">>="))) (Lambda le [pat] y)) =
    case y of
        Do lf ss -> Do la (Generator lb pat x : ss)
        _        -> Do la [Generator lb pat x, Qualifier le y]
applyDoSyntax1 exp@(InfixApp la x (QVarOp lb (UnQual lc (Symbol ld ">>"))) y) =
    case y of
        Do lf ss -> Do la (Qualifier lb x : ss)
        _        -> Do la [Qualifier lb x, Qualifier lc y]
applyDoSyntax1 exp = exp