on master help sign in
Provide implementation for Type.toString
9c7e614Evan Czaplicki
src/Elm/Compiler/Type.hs+70−9
@@ -6,13 +6,14 @@ module Elm.Compiler.Type
6
6
7import Control.Applicative ((<$>), (<*>))
7import Control.Applicative ((<$>), (<*>))
8import Control.Arrow (second)
8import Control.Arrow (second)
9−import Data.Aeson ((.:), (.:?), (.=))
9+import Data.Aeson ((.:), (.=))
10import qualified Data.Aeson as Json
10import qualified Data.Aeson as Json
11import qualified Data.ByteString.Lazy.Char8 as BS
11import qualified Data.ByteString.Lazy.Char8 as BS
12+import qualified Data.List as List
12import qualified Data.Text as Text
13import qualified Data.Text as Text
13
14
14−import qualified AST.Type as Type
15+import qualified AST.Helpers as Help
15−import qualified AST.Variable as Var
16+import Elm.Utils ((|>))
16
17
17
18
18data Type
19data Type
@@ -25,14 +26,74 @@ data Type
25
26
26-- TO STRING
27-- TO STRING
27
28
29+data Context = None | ADT | Function
30+
31+
28toString :: Type -> String
32toString :: Type -> String
29toString tipe =
33toString tipe =
34+ toStringHelp None tipe
35+
36+
37+toStringHelp :: Context -> Type -> String
38+toStringHelp context tipe =
30− case tipe of
39+ case tipe of
31− Lambda t t' -> undefined
40+ Lambda t1 t2 ->
32− Var x -> undefined
41+ let string = toStringHelp Function t1 ++ " -> " ++ toString t2
42+ in
43+ case context of
44+ None -> string
45+ _ -> parens string
46+
47+ Var name -> name
48+
33− Type name -> undefined
49+ Type name -> name
34− App t ts -> undefined
50+
51+ App (Type "List") [t] ->
52+ sandwich "[" "]" (toString t)
53+
54+ App (Type name) args
55+ | Help.isTuple name ->
56+ map toString args
57+ |> List.intercalate ", "
58+ |> parens
59+
60+ | otherwise ->
61+ let string = name ++ spacePrefix (map (toStringHelp ADT) args)
62+ in
63+ case (context, args) of
64+ (ADT, _ : _) -> parens string
65+ _ -> string
66+
35− Record fields maybeExtension -> undefined
67+ Record fields maybeExtension ->
68+ let viewField (key, value) =
69+ key ++ " : " ++ toString value
70+
71+ viewExtension maybeType =
72+ case maybeType of
73+ Nothing -> ""
74+ Just t -> toString t ++ " | "
75+ in
76+ sandwich "{ " " }" $
77+ concat
78+ [ viewExtension maybeExtension
79+ , map viewField fields
80+ |> List.intercalate ", "
81+ ]
82+
83+
84+parens :: String -> String
85+parens string =
86+ sandwich "(" ")" string
87+
88+
89+spacePrefix :: [String] -> String
90+spacePrefix strings =
91+ concatMap (" " ++) strings
92+
93+
94+sandwich :: String -> String -> String -> String
95+sandwich start stop string =
96+ start ++ string ++ stop
36
97
37
98
38-- JSON for TYPE
99-- JSON for TYPE