packages feed

Elm-0.1.0: src/Parse/ParsePatterns.hs

module ParsePatterns (pattern_term, pattern_expr) where

import Ast
import Combinators
import Data.Char (isUpper)
import ParserLib
import Tokens

pattern_basic =
    (t UNDERSCORE >> return PAnything) +|+
    (do { x@(c:_) <- var ;
          if isUpper c then star pattern_term >>= return . PData x
                       else return $ PVar x })

pattern_tuple = do
  t LPAREN; ps <- sepBy1 (t COMMA) pattern_expr; t RPAREN
  return $ case ps of { [p] -> p; _ -> ptuple ps }

pattern_cons = do
  p <- pattern_term
  colon <- optional $ op_parser (==":")
  case colon of
    Just ":" -> pattern_expr >>= return . pcons p
    Nothing -> return p

pattern_list = do
  t LBRACKET; ps <- sepBy (t COMMA) pattern_expr; t RBRACKET; return (plist ps)

pattern_term = pattern_tuple +|+ pattern_list +|+ pattern_basic
pattern_expr = pattern_tuple +|+ pattern_list +|+ pattern_cons