on master help sign in
Switch to the CPS'd result type for everything
740341fEvan Czaplicki
src/Canonicalize/Effects.hs+1−1
@@ -16,12 +16,12 @@ import qualified AST.Valid as Valid
16import qualified AST.Module.Name as ModuleName
16import qualified AST.Module.Name as ModuleName
17import qualified AST.Utils.Type as Type
17import qualified AST.Utils.Type as Type
18import qualified Canonicalize.Environment as Env
18import qualified Canonicalize.Environment as Env
19−import qualified Canonicalize.Result as Result
20import qualified Canonicalize.Type as Type
19import qualified Canonicalize.Type as Type
21import qualified Elm.Name as N
20import qualified Elm.Name as N
22import qualified Reporting.Annotation as A
21import qualified Reporting.Annotation as A
23import qualified Reporting.Error.Canonicalize as Error
22import qualified Reporting.Error.Canonicalize as Error
24import qualified Reporting.Region as R
23import qualified Reporting.Region as R
24+import qualified Reporting.Result as Result
25
25
26
26
27
27
src/Canonicalize/Environment.hs+1−1
@@ -23,13 +23,13 @@ import qualified Data.Map.Merge.Strict as Map
23import qualified AST.Utils.Binop as Binop
23import qualified AST.Utils.Binop as Binop
24import qualified AST.Canonical as Can
24import qualified AST.Canonical as Can
25import qualified AST.Module.Name as ModuleName
25import qualified AST.Module.Name as ModuleName
26−import qualified Canonicalize.Result as Result
27import qualified Data.Bag as Bag
26import qualified Data.Bag as Bag
28import qualified Data.Index as Index
27import qualified Data.Index as Index
29import qualified Data.OneOrMore as OneOrMore
28import qualified Data.OneOrMore as OneOrMore
30import qualified Elm.Name as N
29import qualified Elm.Name as N
31import qualified Reporting.Error.Canonicalize as Error
30import qualified Reporting.Error.Canonicalize as Error
32import qualified Reporting.Region as R
31import qualified Reporting.Region as R
32+import qualified Reporting.Result as Result
33
33
34
34
35
35
src/Canonicalize/Environment/Dups.hs+1−1
@@ -15,12 +15,12 @@ module Canonicalize.Environment.Dups
15
15
16import qualified Data.Map as Map
16import qualified Data.Map as Map
17
17
18−import qualified Canonicalize.Result as Result
19import qualified Data.OneOrMore as OneOrMore
18import qualified Data.OneOrMore as OneOrMore
20import qualified Elm.Name as N
19import qualified Elm.Name as N
21import qualified Reporting.Annotation as A
20import qualified Reporting.Annotation as A
22import qualified Reporting.Error.Canonicalize as Error
21import qualified Reporting.Error.Canonicalize as Error
23import qualified Reporting.Region as R
22import qualified Reporting.Region as R
23+import qualified Reporting.Result as Result
24
24
25
25
26
26
src/Canonicalize/Environment/Foreign.hs+3−3
@@ -13,7 +13,6 @@ import qualified AST.Canonical as Can
13import qualified AST.Source as Src
13import qualified AST.Source as Src
14import qualified AST.Module.Name as ModuleName
14import qualified AST.Module.Name as ModuleName
15import qualified Canonicalize.Environment as Env
15import qualified Canonicalize.Environment as Env
16−import qualified Canonicalize.Result as Result
17import qualified Data.Bag as Bag
16import qualified Data.Bag as Bag
18import qualified Data.Index as Index
17import qualified Data.Index as Index
19import qualified Data.OneOrMore as OneOrMore
18import qualified Data.OneOrMore as OneOrMore
@@ -23,6 +22,7 @@ import qualified Reporting.Annotation as A
23import qualified Reporting.Error.Canonicalize as Error
22import qualified Reporting.Error.Canonicalize as Error
24import qualified Reporting.Helpers as Help (nearbyNames)
23import qualified Reporting.Helpers as Help (nearbyNames)
25import qualified Reporting.Region as R
24import qualified Reporting.Region as R
25+import qualified Reporting.Result as Result
26
26
27
27
28
28
@@ -144,8 +144,8 @@ toExplicitHomes home prefix explicits toInfo toBag name value =
144 (Map.singleton prefix (OneOrMore.one info))
144 (Map.singleton prefix (OneOrMore.one info))
145
145
146
146
147−toBinopHomes :: ModuleName.Canonical -> N.Name -> I.Op -> OneOrMore.OneOrMore Env.Binop
147+toBinopHomes :: ModuleName.Canonical -> N.Name -> I.Binop -> OneOrMore.OneOrMore Env.Binop
148−toBinopHomes home op (I.Op name annotation associativity precedence) =
148+toBinopHomes home op (I.Binop name annotation associativity precedence) =
149 OneOrMore.one (Env.Binop op home name annotation associativity precedence)
149 OneOrMore.one (Env.Binop op home name annotation associativity precedence)
150
150
151
151
src/Canonicalize/Environment/Local.hs+1−1
@@ -18,7 +18,6 @@ import qualified AST.Source as Src
18import qualified AST.Valid as Valid
18import qualified AST.Valid as Valid
19import qualified Canonicalize.Environment as Env
19import qualified Canonicalize.Environment as Env
20import qualified Canonicalize.Environment.Dups as Dups
20import qualified Canonicalize.Environment.Dups as Dups
21−import qualified Canonicalize.Result as Result
22import qualified Canonicalize.Type as Type
21import qualified Canonicalize.Type as Type
23import qualified Data.Bag as Bag
22import qualified Data.Bag as Bag
24import qualified Data.Index as Index
23import qualified Data.Index as Index
@@ -26,6 +25,7 @@ import qualified Elm.Name as N
26import qualified Reporting.Annotation as A
25import qualified Reporting.Annotation as A
27import qualified Reporting.Error.Canonicalize as Error
26import qualified Reporting.Error.Canonicalize as Error
28import qualified Reporting.Region as R
27import qualified Reporting.Region as R
28+import qualified Reporting.Result as Result
29import qualified Reporting.Warning as Warning
29import qualified Reporting.Warning as Warning
30
30
31
31
src/Canonicalize/Expression.hs+1−1
@@ -21,7 +21,6 @@ import qualified AST.Valid as Valid
21import qualified Canonicalize.Environment as Env
21import qualified Canonicalize.Environment as Env
22import qualified Canonicalize.Environment.Dups as Dups
22import qualified Canonicalize.Environment.Dups as Dups
23import qualified Canonicalize.Pattern as Pattern
23import qualified Canonicalize.Pattern as Pattern
24−import qualified Canonicalize.Result as Result
25import qualified Canonicalize.Type as Type
24import qualified Canonicalize.Type as Type
26import qualified Data.Bag as Bag
25import qualified Data.Bag as Bag
27import qualified Data.Index as Index
26import qualified Data.Index as Index
@@ -30,6 +29,7 @@ import qualified Elm.Name as N
30import qualified Reporting.Annotation as A
29import qualified Reporting.Annotation as A
31import qualified Reporting.Error.Canonicalize as Error
30import qualified Reporting.Error.Canonicalize as Error
32import qualified Reporting.Region as R
31import qualified Reporting.Region as R
32+import qualified Reporting.Result as Result
33import qualified Reporting.Warning as W
33import qualified Reporting.Warning as W
34
34
35
35
src/Canonicalize/Module.hs+1−1
@@ -19,7 +19,6 @@ import qualified Canonicalize.Environment.Foreign as Foreign
19import qualified Canonicalize.Environment.Local as Local
19import qualified Canonicalize.Environment.Local as Local
20import qualified Canonicalize.Expression as Expr
20import qualified Canonicalize.Expression as Expr
21import qualified Canonicalize.Pattern as Pattern
21import qualified Canonicalize.Pattern as Pattern
22−import qualified Canonicalize.Result as Result
23import qualified Canonicalize.Type as Type
22import qualified Canonicalize.Type as Type
24import qualified Data.Index as Index
23import qualified Data.Index as Index
25import qualified Elm.Interface as I
24import qualified Elm.Interface as I
@@ -27,6 +26,7 @@ import qualified Elm.Name as N
27import qualified Elm.Package as Pkg
26import qualified Elm.Package as Pkg
28import qualified Reporting.Annotation as A
27import qualified Reporting.Annotation as A
29import qualified Reporting.Error.Canonicalize as Error
28import qualified Reporting.Error.Canonicalize as Error
29+import qualified Reporting.Result as Result
30import qualified Reporting.Warning as W
30import qualified Reporting.Warning as W
31
31
32
32
src/Canonicalize/Pattern.hs+1−1
@@ -14,12 +14,12 @@ import qualified AST.Canonical as Can
14import qualified AST.Source as Src
14import qualified AST.Source as Src
15import qualified Canonicalize.Environment as Env
15import qualified Canonicalize.Environment as Env
16import qualified Canonicalize.Environment.Dups as Dups
16import qualified Canonicalize.Environment.Dups as Dups
17−import qualified Canonicalize.Result as Result
18import qualified Data.Index as Index
17import qualified Data.Index as Index
19import qualified Elm.Name as N
18import qualified Elm.Name as N
20import qualified Reporting.Annotation as A
19import qualified Reporting.Annotation as A
21import qualified Reporting.Error.Canonicalize as Error
20import qualified Reporting.Error.Canonicalize as Error
22import qualified Reporting.Region as R
21import qualified Reporting.Region as R
22+import qualified Reporting.Result as Result
23
23
24
24
25
25
src/Canonicalize/Result.hsdeleted−112
@@ -1,112 +0,0 @@
1−{-# OPTIONS_GHC -Wall #-}
2−{-# LANGUAGE Rank2Types #-}
3−module Canonicalize.Result
4− ( Result(..)
5− , run
6− , ok
7− , warn
8− , throw
9− )
10− where
11−
12−
13−-- TODO try adding INLINE to warn, throw, (>>=), etc.
14−
15−
16−import qualified Data.OneOrMore as OneOrMore
17−import qualified Reporting.Warning as Warning
18−
19−
20−
21−-- RESULT
22−
23−
24−newtype Result info warnings error a =
25− Result (
26− forall result.
27− info
28− -> warnings
29− -> (info -> warnings -> OneOrMore.OneOrMore error -> result)
30− -> (info -> warnings -> a -> result)
31− -> result
32− )
33−
34−
35−run :: Result () [w] e a -> ([w], Either (OneOrMore.OneOrMore e) a)
36−run (Result k) =
37− k () []
38− (\() w e -> (reverse w, Left e))
39− (\() w a -> (reverse w, Right a))
40−
41−
42−
43−-- HELPERS
44−
45−
46−{-# INLINE ok #-}
47−ok :: a -> Result i w e a
48−ok a =
49− Result $ \i w _ good ->
50− good i w a
51−
52−
53−warn :: Warning.Warning -> Result i [Warning.Warning] e ()
54−warn warning =
55− Result $ \i warnings _ good ->
56− good i (warning:warnings) ()
57−
58−
59−throw :: e -> Result i w e a
60−throw e =
61− Result $ \i w bad _ ->
62− bad i w (OneOrMore.one e)
63−
64−
65−
66−-- FANCY INSTANCE STUFF
67−
68−
69−instance Functor (Result i w e) where
70− fmap func (Result k) =
71− Result $ \i w bad good ->
72− let
73− good1 i1 w1 value =
74− good i1 w1 (func value)
75− in
76− k i w bad good1
77−
78−
79−instance Applicative (Result i w e) where
80− pure = ok
81−
82− (<*>) (Result kf) (Result kv) =
83− Result $ \i w bad good ->
84− let
85− bad1 i1 w1 e1 =
86− let
87− bad2 i2 w2 e2 = bad i2 w2 (OneOrMore.more e1 e2)
88− good2 i2 w2 _value = bad i2 w2 e1
89− in
90− kv i1 w1 bad2 good2
91−
92− good1 i1 w1 func =
93− let
94− bad2 i2 w2 e2 = bad i2 w2 e2
95− good2 i2 w2 value = good i2 w2 (func value)
96− in
97− kv i1 w1 bad2 good2
98− in
99− kf i w bad1 good1
100−
101−
102−instance Monad (Result i w e) where
103− return = ok
104−
105− (>>=) (Result ka) callback =
106− Result $ \i w bad good ->
107− let
108− good1 i1 w1 a =
109− case callback a of
110− Result kb -> kb i1 w1 bad good
111− in
112− ka i w bad good1
src/Canonicalize/Type.hs+1−1
@@ -13,11 +13,11 @@ import qualified AST.Canonical as Can
13import qualified AST.Source as Src
13import qualified AST.Source as Src
14import qualified Canonicalize.Environment as Env
14import qualified Canonicalize.Environment as Env
15import qualified Canonicalize.Environment.Dups as Dups
15import qualified Canonicalize.Environment.Dups as Dups
16−import qualified Canonicalize.Result as Result
17import qualified Elm.Name as N
16import qualified Elm.Name as N
18import qualified Reporting.Annotation as A
17import qualified Reporting.Annotation as A
19import qualified Reporting.Error.Canonicalize as Error
18import qualified Reporting.Error.Canonicalize as Error
20import qualified Reporting.Region as R
19import qualified Reporting.Region as R
20+import qualified Reporting.Result as Result
21
21
22
22
23
23
src/Reporting/Result.hs+86−156
@@ -1,193 +1,123 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE Rank2Types #-}
2module Reporting.Result
3module Reporting.Result
3 ( Result(..)
4 ( Result(..)
4− , Answer(..)
5+ , run
5 , ok
6 , ok
6− , throw
7− , accumulate
8 , warn
7 , warn
9− , untracked
8+ , throw
10− , from
11 , mapError
9 , mapError
12− , format
13− , answerToEither
14− , oneToValue
15 )
10 )
16 where
11 where
17
12
18−import Control.Monad.Except (Except, runExcept)
19−
20−import qualified Data.Bag as Bag
21−import qualified Reporting.Annotation as A
22−import qualified Reporting.Region as R
23−
24−
25−
26−-- RESULTS
27−
28−
29−data Result info warning error result =
30− Result
31− { _info :: info
32− , _warnings :: LBag warning
33− , _answer :: Answer (LBag error) result
34− }
35−
36−
37−data Answer e a = Ok a | Err e
38
13
14+-- TODO try adding INLINE to warn, throw, (>>=), etc.
39
15
40−type LBag a =
41− Bag.Bag (A.Located a)
42
16
17+import qualified Data.OneOrMore as OneOrMore
18+import qualified Reporting.Warning as Warning
43
19
44−data One a = None | One a
45
20
46
21
22+-- RESULT
47
23
48−-- RESULT HELPERS
49−
50−
51−ok :: (Monoid i) => a -> Result i w e a
52−ok value =
53− Result mempty Bag.empty (Ok value)
54−
55−
56−throw :: (Monoid i) => R.Region -> e -> Result i w e a
57−throw region err =
58− Result mempty Bag.empty (Err (Bag.one (A.A region err)))
59
24
25+newtype Result info warnings error a =
26+ Result (
27+ forall result.
28+ info
29+ -> warnings
30+ -> (info -> warnings -> OneOrMore.OneOrMore error -> result)
31+ -> (info -> warnings -> a -> result)
32+ -> result
33+ )
60
34
61−accumulate :: (Monoid i) => i -> a -> Result i w e a
62−accumulate info value =
63− Result info Bag.empty (Ok value)
64
35
36+run :: Result () [w] e a -> ([w], Either (OneOrMore.OneOrMore e) a)
37+run (Result k) =
38+ k () []
39+ (\() w e -> (reverse w, Left e))
40+ (\() w a -> (reverse w, Right a))
65
41
66−warn :: (Monoid i) => R.Region -> w -> a -> Result i w e a
67−warn region warning a =
68− Result mempty (Bag.one (A.A region warning)) (Ok a)
69
42
70
43
44+-- HELPERS
71
45
72−-- EXTRACTION HELPERS
73
46
47+{-# INLINE ok #-}
48+ok :: a -> Result i w e a
49+ok a =
50+ Result $ \i w _ good ->
51+ good i w a
74
52
75−untracked :: (Monoid i) => Result () w e a -> Result i w e a
76−untracked (Result () warnings answer) =
77− Result mempty warnings answer
78
53
54+warn :: Warning.Warning -> Result i [Warning.Warning] e ()
55+warn warning =
56+ Result $ \i warnings _ good ->
57+ good i (warning:warnings) ()
79
58
80−from :: (Monoid i) => (e -> e') -> Except [A.Located e] a -> Result i w e' a
81−from f except =
82− case runExcept except of
83− Right answer ->
84− ok answer
85
59
86− Left errors ->
60+throw :: e -> Result i w e a
87− Result mempty Bag.empty (Err (Bag.fromList (A.map f) errors))
61+throw e =
62+ Result $ \i w bad _ ->
63+ bad i w (OneOrMore.one e)
88
64
89
65
90mapError :: (e -> e') -> Result i w e a -> Result i w e' a
66mapError :: (e -> e') -> Result i w e a -> Result i w e' a
91−mapError f (Result info warnings rawResult) =
67+mapError func (Result k) =
92− Result info warnings $
68+ Result $ \i w bad good ->
93− case rawResult of
69+ let
94− Ok v ->
70+ bad1 i1 w1 e1 =
95− Ok v
71+ bad i1 w1 (OneOrMore.map func e1)
96−
72+ in
97− Err msgs ->
73+ k i w bad1 good
98− Err (Bag.map (A.map f) msgs)
99−
100−
101−format :: (Monoid i) => (e -> e') -> Result () w e a -> Result i w e' a
102−format func (Result _ warnings answer) =
103− mapError func (Result mempty warnings answer)
104−
105−
106−answerToEither :: (A.Located e -> e') -> (a -> a') -> Answer (LBag e) a -> Either [e'] a'
107−answerToEither onErr onOk answer =
108− case answer of
109− Ok value ->
110− Right (onOk value)
111
74
112− Err errors ->
113− Left (map onErr (Bag.toList errors))
114
75
115
76
116−oneToValue :: b -> (a -> b) -> One a -> b
77+-- FANCY INSTANCE STUFF
117−oneToValue fallback onOne one =
118− case one of
119− None ->
120− fallback
121−
122− One value ->
123− onOne value
124−
125−
126−
127−-- EXTRA FANCY HELPERS
128
78
129
79
130instance Functor (Result i w e) where
80instance Functor (Result i w e) where
131− fmap func (Result info warnings rawResult) =
81+ fmap func (Result k) =
132− case rawResult of
82+ Result $ \i w bad good ->
133− Ok a ->
83+ let
134− Result info warnings (Ok (func a))
84+ good1 i1 w1 value =
135−
85+ good i1 w1 (func value)
136− Err msgs ->
86+ in
137− Result info warnings (Err msgs)
87+ k i w bad good1
138−
88+
139−
89+
140−instance (Monoid i) => Applicative (Result i w e) where
90+instance Applicative (Result i w e) where
141− pure value =
91+ pure = ok
142− ok value
92+
143−
93+ (<*>) (Result kf) (Result kv) =
144− (<*>) (Result info warnings resultFunc) (Result info' warnings' resultVal) =
94+ Result $ \i w bad good ->
145− Result (mappend info info') (Bag.append warnings warnings') $
95+ let
146− case (resultFunc, resultVal) of
96+ bad1 i1 w1 e1 =
147− (Ok func, Ok val) ->
97+ let
148− Ok (func val)
98+ bad2 i2 w2 e2 = bad i2 w2 (OneOrMore.more e1 e2)
149−
99+ good2 i2 w2 _value = bad i2 w2 e1
150− (Err msgs, Err msgs') ->
100+ in
151− Err (Bag.append msgs msgs')
101+ kv i1 w1 bad2 good2
152−
102+
153− (Err msgs, _) ->
103+ good1 i1 w1 func =
154− Err msgs
104+ let
155−
105+ bad2 i2 w2 e2 = bad i2 w2 e2
156− (_, Err msgs) ->
106+ good2 i2 w2 value = good i2 w2 (func value)
157− Err msgs
107+ in
158−
108+ kv i1 w1 bad2 good2
159−
109+ in
110+ kf i w bad1 good1
111+
112+
160−instance (Monoid i) => Monad (Result i w e) where
113+instance Monad (Result i w e) where
161− return value =
114+ return = ok
162− ok value
115+
163−
164− (>>=) (Result info warnings rawResult) callback =
116+ (>>=) (Result ka) callback =
165− case rawResult of
117+ Result $ \i w bad good ->
166− Err msg ->
167− Result info warnings (Err msg)
168−
169− Ok value ->
170− let
118+ let
171− (Result info' warnings' rawResult') =
119+ good1 i1 w1 a =
172− callback value
173− in
174− Result
175− (mappend info info')
176− (Bag.append warnings warnings')
177− rawResult'
178−
179−
180−instance Monoid (One a) where
181− mempty =
182− None
183−
184− mappend left right =
185− case (left, right) of
120+ case callback a of
186− (other, None) ->
121+ Result kb -> kb i1 w1 bad good
187− other
122+ in
188−
123+ ka i w bad good1
189− (None, other) ->
190− other
191−
192− (One _, One _) ->
193− error "There should only be one!"