@@ -256,7 +256,7 @@ moduleToJs (Module coms mn imps exps foreigns decls) = do
256256 jss <- forM binders $ \(CaseAlternative bs result) -> do
257257 ret <- guardsToJs result
258258 go valNames ret bs
259− return $ JSApp (JSFunction Nothing [] (JSBlock (assignments ++ concat jss ++ [JSThrow $ JSUnary JSNew $ JSApp (JSVar "Error") [JSStringLiteral "Failed pattern match"]])))
259+ return $ JSApp (JSFunction Nothing [] (JSBlock (assignments ++ concat jss ++ [JSThrow $ failedPatternError valNames])))
260260 []
261261 where
262262 go :: [String] -> [JS] -> [Binder Ann] -> m [JS]
@@ -266,6 +266,15 @@ moduleToJs (Module coms mn imps exps foreigns decls) = do
266266 binderToJs v done'' b
267267 go _ _ _ = error "Invalid arguments to bindersToJs"
268268
269+ failedPatternError :: [String] -> JS
270+ failedPatternError names = JSUnary JSNew $ JSApp (JSVar "Error") [JSBinary Add (JSStringLiteral "Failed pattern match: ") (JSArrayLiteral $ zipWith valueError names vals)]
271+
272+ valueError :: String -> JS -> JS
273+ valueError _ l@(JSNumericLiteral _) = l
274+ valueError _ l@(JSStringLiteral _) = l
275+ valueError _ l@(JSBooleanLiteral _) = l
276+ valueError s _ = JSAccessor "name" . JSAccessor "constructor" $ JSVar s
277+
269278 guardsToJs :: Either [(Guard Ann, Expr Ann)] (Expr Ann) -> m [JS]
270279 guardsToJs (Left gs) = forM gs $ \(cond, val) -> do
271280 cond' <- valueToJs cond