on master help sign in
Switch to the CPS'd result type for everything
commit740341f988764167cb9c6f5a7f2473a0e69d827f authorEvan Czaplicki <evancz@users.noreply.github.com> dateFri 8 Dec 2017, 14:00 (9 years ago) parent6bc0cbb
11 files changed+97−279
src/Canonicalize/Effects.hs+1−1 src/Canonicalize/Environment.hs+1−1 src/Canonicalize/Environment/Dups.hs+1−1 src/Canonicalize/Environment/Foreign.hs+3−3 src/Canonicalize/Environment/Local.hs+1−1 src/Canonicalize/Expression.hs+1−1 src/Canonicalize/Module.hs+1−1 src/Canonicalize/Pattern.hs+1−1 src/Canonicalize/Result.hs−112 src/Canonicalize/Type.hs+1−1 src/Reporting/Result.hs+86−156
src/Canonicalize/Effects.hs+1−1
@@ -16,12 +16,12 @@ import qualified AST.Valid as Valid
1616import qualified AST.Module.Name as ModuleName
1717import qualified AST.Utils.Type as Type
1818import qualified Canonicalize.Environment as Env
19−import qualified Canonicalize.Result as Result
2019import qualified Canonicalize.Type as Type
2120import qualified Elm.Name as N
2221import qualified Reporting.Annotation as A
2322import qualified Reporting.Error.Canonicalize as Error
2423import qualified Reporting.Region as R
24+import qualified Reporting.Result as Result
2525
2626
2727
src/Canonicalize/Environment.hs+1−1
@@ -23,13 +23,13 @@ import qualified Data.Map.Merge.Strict as Map
2323import qualified AST.Utils.Binop as Binop
2424import qualified AST.Canonical as Can
2525import qualified AST.Module.Name as ModuleName
26−import qualified Canonicalize.Result as Result
2726import qualified Data.Bag as Bag
2827import qualified Data.Index as Index
2928import qualified Data.OneOrMore as OneOrMore
3029import qualified Elm.Name as N
3130import qualified Reporting.Error.Canonicalize as Error
3231import qualified Reporting.Region as R
32+import qualified Reporting.Result as Result
3333
3434
3535
src/Canonicalize/Environment/Dups.hs+1−1
@@ -15,12 +15,12 @@ module Canonicalize.Environment.Dups
1515
1616import qualified Data.Map as Map
1717
18−import qualified Canonicalize.Result as Result
1918import qualified Data.OneOrMore as OneOrMore
2019import qualified Elm.Name as N
2120import qualified Reporting.Annotation as A
2221import qualified Reporting.Error.Canonicalize as Error
2322import qualified Reporting.Region as R
23+import qualified Reporting.Result as Result
2424
2525
2626
src/Canonicalize/Environment/Foreign.hs+3−3
@@ -13,7 +13,6 @@ import qualified AST.Canonical as Can
1313import qualified AST.Source as Src
1414import qualified AST.Module.Name as ModuleName
1515import qualified Canonicalize.Environment as Env
16−import qualified Canonicalize.Result as Result
1716import qualified Data.Bag as Bag
1817import qualified Data.Index as Index
1918import qualified Data.OneOrMore as OneOrMore
@@ -23,6 +22,7 @@ import qualified Reporting.Annotation as A
2322import qualified Reporting.Error.Canonicalize as Error
2423import qualified Reporting.Helpers as Help (nearbyNames)
2524import qualified Reporting.Region as R
25+import qualified Reporting.Result as Result
2626
2727
2828
@@ -144,8 +144,8 @@ toExplicitHomes home prefix explicits toInfo toBag name value =
144144 (Map.singleton prefix (OneOrMore.one info))
145145
146146
147−toBinopHomes :: ModuleName.Canonical -> N.Name -> I.Op -> OneOrMore.OneOrMore Env.Binop
148−toBinopHomes home op (I.Op name annotation associativity precedence) =
147+toBinopHomes :: ModuleName.Canonical -> N.Name -> I.Binop -> OneOrMore.OneOrMore Env.Binop
148+toBinopHomes home op (I.Binop name annotation associativity precedence) =
149149 OneOrMore.one (Env.Binop op home name annotation associativity precedence)
150150
151151
src/Canonicalize/Environment/Local.hs+1−1
@@ -18,7 +18,6 @@ import qualified AST.Source as Src
1818import qualified AST.Valid as Valid
1919import qualified Canonicalize.Environment as Env
2020import qualified Canonicalize.Environment.Dups as Dups
21−import qualified Canonicalize.Result as Result
2221import qualified Canonicalize.Type as Type
2322import qualified Data.Bag as Bag
2423import qualified Data.Index as Index
@@ -26,6 +25,7 @@ import qualified Elm.Name as N
2625import qualified Reporting.Annotation as A
2726import qualified Reporting.Error.Canonicalize as Error
2827import qualified Reporting.Region as R
28+import qualified Reporting.Result as Result
2929import qualified Reporting.Warning as Warning
3030
3131
src/Canonicalize/Expression.hs+1−1
@@ -21,7 +21,6 @@ import qualified AST.Valid as Valid
2121import qualified Canonicalize.Environment as Env
2222import qualified Canonicalize.Environment.Dups as Dups
2323import qualified Canonicalize.Pattern as Pattern
24−import qualified Canonicalize.Result as Result
2524import qualified Canonicalize.Type as Type
2625import qualified Data.Bag as Bag
2726import qualified Data.Index as Index
@@ -30,6 +29,7 @@ import qualified Elm.Name as N
3029import qualified Reporting.Annotation as A
3130import qualified Reporting.Error.Canonicalize as Error
3231import qualified Reporting.Region as R
32+import qualified Reporting.Result as Result
3333import qualified Reporting.Warning as W
3434
3535
src/Canonicalize/Module.hs+1−1
@@ -19,7 +19,6 @@ import qualified Canonicalize.Environment.Foreign as Foreign
1919import qualified Canonicalize.Environment.Local as Local
2020import qualified Canonicalize.Expression as Expr
2121import qualified Canonicalize.Pattern as Pattern
22−import qualified Canonicalize.Result as Result
2322import qualified Canonicalize.Type as Type
2423import qualified Data.Index as Index
2524import qualified Elm.Interface as I
@@ -27,6 +26,7 @@ import qualified Elm.Name as N
2726import qualified Elm.Package as Pkg
2827import qualified Reporting.Annotation as A
2928import qualified Reporting.Error.Canonicalize as Error
29+import qualified Reporting.Result as Result
3030import qualified Reporting.Warning as W
3131
3232
src/Canonicalize/Pattern.hs+1−1
@@ -14,12 +14,12 @@ import qualified AST.Canonical as Can
1414import qualified AST.Source as Src
1515import qualified Canonicalize.Environment as Env
1616import qualified Canonicalize.Environment.Dups as Dups
17−import qualified Canonicalize.Result as Result
1817import qualified Data.Index as Index
1918import qualified Elm.Name as N
2019import qualified Reporting.Annotation as A
2120import qualified Reporting.Error.Canonicalize as Error
2221import qualified Reporting.Region as R
22+import qualified Reporting.Result as Result
2323
2424
2525
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
1313import qualified AST.Source as Src
1414import qualified Canonicalize.Environment as Env
1515import qualified Canonicalize.Environment.Dups as Dups
16−import qualified Canonicalize.Result as Result
1716import qualified Elm.Name as N
1817import qualified Reporting.Annotation as A
1918import qualified Reporting.Error.Canonicalize as Error
2019import qualified Reporting.Region as R
20+import qualified Reporting.Result as Result
2121
2222
2323
src/Reporting/Result.hs+86−156
@@ -1,193 +1,123 @@
11{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE Rank2Types #-}
23module Reporting.Result
34 ( Result(..)
4− , Answer(..)
5+ , run
56 , ok
6− , throw
7− , accumulate
87 , warn
9− , untracked
10− , from
8+ , throw
119 , mapError
12− , format
13− , answerToEither
14− , oneToValue
1510 )
1611 where
1712
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
3813
14+-- TODO try adding INLINE to warn, throw, (>>=), etc.
3915
40−type LBag a =
41− Bag.Bag (A.Located a)
4216
17+import qualified Data.OneOrMore as OneOrMore
18+import qualified Reporting.Warning as Warning
4319
44−data One a = None | One a
4520
4621
22+-- RESULT
4723
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)))
5924
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+ )
6034
61−accumulate :: (Monoid i) => i -> a -> Result i w e a
62−accumulate info value =
63− Result info Bag.empty (Ok value)
6435
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))
6541
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)
6942
7043
44+-- HELPERS
7145
72−-- EXTRACTION HELPERS
7346
47+{-# INLINE ok #-}
48+ok :: a -> Result i w e a
49+ok a =
50+ Result $ \i w _ good ->
51+ good i w a
7452
75−untracked :: (Monoid i) => Result () w e a -> Result i w e a
76−untracked (Result () warnings answer) =
77− Result mempty warnings answer
7853
54+warn :: Warning.Warning -> Result i [Warning.Warning] e ()
55+warn warning =
56+ Result $ \i warnings _ good ->
57+ good i (warning:warnings) ()
7958
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
8559
86− Left errors ->
87− Result mempty Bag.empty (Err (Bag.fromList (A.map f) errors))
60+throw :: e -> Result i w e a
61+throw e =
62+ Result $ \i w bad _ ->
63+ bad i w (OneOrMore.one e)
8864
8965
9066mapError :: (e -> e') -> Result i w e a -> Result i w e' a
91−mapError f (Result info warnings rawResult) =
92− Result info warnings $
93− case rawResult of
94− Ok v ->
95− Ok v
96−
97− Err msgs ->
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)
67+mapError func (Result k) =
68+ Result $ \i w bad good ->
69+ let
70+ bad1 i1 w1 e1 =
71+ bad i1 w1 (OneOrMore.map func e1)
72+ in
73+ k i w bad1 good
11174
112− Err errors ->
113− Left (map onErr (Bag.toList errors))
11475
11576
116−oneToValue :: b -> (a -> b) -> One a -> b
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
77+-- FANCY INSTANCE STUFF
12878
12979
13080instance Functor (Result i w e) where
131− fmap func (Result info warnings rawResult) =
132− case rawResult of
133− Ok a ->
134− Result info warnings (Ok (func a))
135−
136− Err msgs ->
137− Result info warnings (Err msgs)
138−
139−
140−instance (Monoid i) => Applicative (Result i w e) where
141− pure value =
142− ok value
143−
144− (<*>) (Result info warnings resultFunc) (Result info' warnings' resultVal) =
145− Result (mappend info info') (Bag.append warnings warnings') $
146− case (resultFunc, resultVal) of
147− (Ok func, Ok val) ->
148− Ok (func val)
149−
150− (Err msgs, Err msgs') ->
151− Err (Bag.append msgs msgs')
152−
153− (Err msgs, _) ->
154− Err msgs
155−
156− (_, Err msgs) ->
157− Err msgs
158−
159−
160−instance (Monoid i) => Monad (Result i w e) where
161− return value =
162− ok value
163−
164− (>>=) (Result info warnings rawResult) callback =
165− case rawResult of
166− Err msg ->
167− Result info warnings (Err msg)
168−
169− Ok value ->
170− let
171− (Result info' warnings' rawResult') =
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
186− (other, None) ->
187− other
188−
189− (None, other) ->
190− other
191−
192− (One _, One _) ->
193− error "There should only be one!"
81+ fmap func (Result k) =
82+ Result $ \i w bad good ->
83+ let
84+ good1 i1 w1 value =
85+ good i1 w1 (func value)
86+ in
87+ k i w bad good1
88+
89+
90+instance Applicative (Result i w e) where
91+ pure = ok
92+
93+ (<*>) (Result kf) (Result kv) =
94+ Result $ \i w bad good ->
95+ let
96+ bad1 i1 w1 e1 =
97+ let
98+ bad2 i2 w2 e2 = bad i2 w2 (OneOrMore.more e1 e2)
99+ good2 i2 w2 _value = bad i2 w2 e1
100+ in
101+ kv i1 w1 bad2 good2
102+
103+ good1 i1 w1 func =
104+ let
105+ bad2 i2 w2 e2 = bad i2 w2 e2
106+ good2 i2 w2 value = good i2 w2 (func value)
107+ in
108+ kv i1 w1 bad2 good2
109+ in
110+ kf i w bad1 good1
111+
112+
113+instance Monad (Result i w e) where
114+ return = ok
115+
116+ (>>=) (Result ka) callback =
117+ Result $ \i w bad good ->
118+ let
119+ good1 i1 w1 a =
120+ case callback a of
121+ Result kb -> kb i1 w1 bad good
122+ in
123+ ka i w bad good1