on a9de234 help sign in
39 lines 1.2 kB history raw
1{-# LANGUAGE DeriveDataTypeable #-}
2module SourceSyntax.Pattern where
4import Data.Char (isDigit)
5import Data.List (intercalate)
6import Data.Data
7import SourceSyntax.Helpers
8import qualified SourceSyntax.Literal as Literal
10data Pattern = PData String [Pattern]
11 | PRecord [String]
12 | PAlias String Pattern
13 | PVar String
14 | PAnything
15 | PLiteral Literal.Literal
16 deriving (Eq, Data, Typeable)
18cons h t = PData "Cons" [h,t]
19nil = PData "Nil" []
20list = foldr cons nil
21tuple es = PData ("Tuple" ++ show (length es)) es
24instance Show Pattern where
25 show p =
26 case p of
27 PVar x -> x
28 PLiteral lit -> show lit
29 PRecord fs -> brkt (intercalate ", " fs)
30 PAlias x p -> show p ++ " as " ++ x
31 PAnything -> "_"
32 PData "Cons" [hd@(PData "Cons" _),tl] ->
33 parens (show hd) ++ " :: " ++ show tl
34 PData "Cons" [hd,tl] -> show hd ++ " :: " ++ show tl
35 PData "Nil" [] -> "[]"
36 PData name ps ->
37 if take 5 name == "Tuple" && all isDigit (drop 5 name) then
38 parens . intercalate ", " $ map show ps
39 else parensIf (not (null ps)) $ unwords (name : map show ps)