@@ -21,12 +21,14 @@
2121
2222module Language.PureScript.Sugar.Operators (
2323 rebracket,
24− removeSignedLiterals
24+ removeSignedLiterals,
25+ desugarOperatorSections
2526) where
2627
27−import Language.PureScript.Names
2828import Language.PureScript.AST
2929import Language.PureScript.Errors
30+import Language.PureScript.Names
31+import Language.PureScript.Supply
3032
3133import Control.Applicative
3234import Control.Monad.State
@@ -148,3 +150,16 @@ matchOp op = do
148150 ident <- parseOp
149151 guard $ ident == op
150152
153+desugarOperatorSections :: Module -> SupplyT (Either ErrorStack) Module
154+desugarOperatorSections (Module mn ds exts) = Module mn <$> mapM goDecl ds <*> pure exts
155+ where
156+
157+ goDecl :: Declaration -> SupplyT (Either ErrorStack) Declaration
158+ (goDecl, _, _) = everywhereOnValuesM return goExpr return
159+
160+ goExpr :: Expr -> SupplyT (Either ErrorStack) Expr
161+ goExpr (OperatorSection op (Left val)) = return $ App (Var op) val
162+ goExpr (OperatorSection op (Right val)) = do
163+ arg <- Ident <$> freshName
164+ return $ Abs (Left arg) $ App (App (Var op) (Var (Qualified Nothing arg))) val
165+ goExpr other = return other