@@ -114,20 +114,32 @@ listHelp start entries =
114114tuple :: R.Position -> Parser Src.RawExpr
115115tuple start =
116116 do leftParen
117+ pos <- getPosition
118+ spos <- whitespace
117119 inContext start E.ExprTuple $ oneOf $
118− [ do op <- infixOp
120+ [ do noSpace pos spos
121+ try (minus >> rightParen)
122+ end <- getPosition
123+ return $ mkBinop start end "-"
124+
125+ , do checkSpace spos
126+ (entry, _, spos2) <- expression
127+ checkSpace spos2
128+ tupleHelp start [entry]
129+
130+ , do noSpace pos spos
131+ op <- infixOp
119132 rightParen
120133 end <- getPosition
121− let x = A.at start end (Src.var "x")
122− let y = A.at start end (Src.var "y")
123− return $ mkLambda start end "x" $ mkLambda start end "y" $
124− A.at start end (Src.Binop [(x, A.at start end op)] y)
134+ return $ mkBinop start end op
125135
126− , do rightParen
136+ , do noSpace pos spos
137+ rightParen
127138 end <- getPosition
128139 return (A.at start end (Src.tuple []))
129140
130− , do comma
141+ , do noSpace pos spos
142+ comma
131143 arity <- chompCommas 2
132144 rightParen
133145 end <- getPosition
@@ -135,11 +147,6 @@ tuple start =
135147 let ann x = A.at start end x
136148 let result = ann (Src.tuple (map (ann . Src.var) args))
137149 return (foldr (mkLambda start end) result args)
138−
139− , do spaces
140− (entry, _, pos) <- expression
141− checkSpace pos
142− tupleHelp start [entry]
143150 ]
144151
145152
@@ -148,6 +155,16 @@ mkLambda start end arg body =
148155 A.at start end (Src.Lambda (A.at start end (P.Var arg)) body)
149156
150157
158+mkBinop :: R.Position -> R.Position -> Text -> Src.RawExpr
159+mkBinop start end op =
160+ let
161+ x = A.at start end (Src.var "x")
162+ y = A.at start end (Src.var "y")
163+ in
164+ mkLambda start end "x" $ mkLambda start end "y" $
165+ A.at start end (Src.Binop [(x, A.at start end op)] y)
166+
167+
151168chompCommas :: Int -> Parser Int
152169chompCommas n =
153170 oneOf