@@ -167,7 +167,9 @@ extension syn (Rule ssym ptm _)
167167 upd ns (DoBind fc n t : ds) = DoBind fc n (update ns t) : upd (dropn n ns) ds
168168 upd ns (DoLet fc n ty t : ds) = DoLet fc n (update ns ty) (update ns t)
169169 : upd (dropn n ns) ds
170− upd ns (DoBindP fc i t : ds) = DoBindP fc (update ns i) (update ns t)
170+ upd ns (DoBindP fc i t ts : ds)
171+ = DoBindP fc (update ns i) (update ns t)
172+ (map (\(l,r) -> (update ns l, update ns r)) ts)
171173 : upd ns ds
172174 upd ns (DoLetP fc i t : ds) = DoLetP fc (update ns i) (update ns t)
173175 : upd ns ds
@@ -736,16 +738,22 @@ TypeSig' ::=
736738@
737739 -}
738740let_ :: SyntaxInfo -> IdrisParser PTerm
739−let_ syn = try (do reserved "let"; n <- name;
741+let_ syn = try (do reserved "let"; fc <- getFC; n <- name;
740742 ty <- option Placeholder (do lchar ':'; expr' syn)
741743 lchar '='
742744 v <- expr syn
745+ ts <- option [] (do lchar '|'
746+ sepBy1 (do_alt syn) (lchar '|'))
743747 reserved "in"; sc <- expr syn
744− return (PLet n ty v sc))
748+ case ts of
749+ [] -> return (PLet n ty v sc)
750+ alts -> return (PCase fc v ((PRef fc n, sc) : ts)))
745751 <|> (do reserved "let"; fc <- getFC; pat <- expr' (syn { inPattern = True } )
746752 symbol "="; v <- expr syn
753+ ts <- option [] (do lchar '|'
754+ sepBy1 (do_alt syn) (lchar '|'))
747755 reserved "in"; sc <- expr syn
748− return (PCase fc v [(pat, sc)]))
756+ return (PCase fc v ((pat, sc) : ts)))
749757 <?> "let binding"
750758
751759{- | Parses a quote goal
@@ -967,17 +975,28 @@ do_ syn
967975 symbol "<-"
968976 fc <- getFC
969977 e <- expr syn;
970− return (DoBind fc i e))
978+ option (DoBind fc i e)
979+ (do lchar '|'
980+ ts <- sepBy1 (do_alt syn) (lchar '|')
981+ return (DoBindP fc (PRef fc i) e ts)))
971982 <|> try (do i <- expr' syn
972983 symbol "<-"
973984 fc <- getFC
974985 e <- expr syn;
975− return (DoBindP fc i e))
986+ option (DoBindP fc i e [])
987+ (do lchar '|'
988+ ts <- sepBy1 (do_alt syn) (lchar '|')
989+ return (DoBindP fc i e ts)))
976990 <|> do e <- expr syn
977991 fc <- getFC
978992 return (DoExp fc e)
979993 <?> "do block expression"
980994
995+do_alt syn = do l <- expr' syn
996+ symbol "=>"
997+ r <- expr' syn
998+ return (l, r)
999+
9811000{- | Parses an expression in idiom brackets
9821001@
9831002Idiom ::= '[|' Expr '|]';