- <|> (gets (\s->[i\\Infix i _ _<-s.infixers])
- >>= \ifs->Variable <$> parseIf (not o flip elem ifs) parseIdent)
+ <|> Code <$> (token CodeToken *> parseIdent)
+ <|> flip (foldr Lambda) <$> (token LambdaToken *> some parseIdent <* token ArrowToken) <*> parseExpr
+ <|> Variable <$> parseWithIfx ((o) not o flip elem)
+
+ parseBracketed :: Parser Expression
+ parseBracketed
+ //Curried prefix infix
+ = (\e op->Apply (Apply fpflip op) e) <$> parseIfx <*> parseExpr
+ //Regular Prefix infix
+ <|> parseIfx
+ //Curried flipped prefix infix
+ <|> Apply <$> parseExpr <*> parseIfx
+ //Parse regular expression
+ <|> parseExpr
+
+ fpflip :: Expression
+ fpflip = Lambda "x" $ Lambda "y" $ Lambda "z" $ Apply (Apply (Variable "x") (Variable "z")) (Variable "y")
+
+ parseWithIfx :: ([String] String -> Bool) -> Parser String
+ parseWithIfx f = gets (\s->[i\\Infix i _ _<-s.infixers]) >>= flip parseIf parseIdent o f
+
+ parseIfx :: Parser Expression
+ parseIfx = Variable <$> parseWithIfx (flip elem)