Subversion

Galculator

?curdirlinks? -

Blame information for rev 7

Line No. Rev Author Line
1 1 paulosilva  
2 7 paulosilva {-# LANGUAGE FlexibleContexts, MultiParamTypeClasses, FlexibleInstances #-}
3 1 paulosilva {-# OPTIONS_GHC -Wall #-}
4  
5 -------------------------------------------------------------------------------
6  
7 {- |
8 Module      :  Control.GalcError
9 Description :  Error messages of Galculator.
10 Copyright   :  (c) Paulo Silva
11 License     :  LGPL
12  
13 Maintainer  :  paufil@di.uminho.pt
14 Stability   :  experimental
15 Portability :  portable
16  
17 -}
18  
19 -------------------------------------------------------------------------------
20  
21 module Control.GalcError (
22   GalcError(..),
23   maybe2error,
24   list2error,
25   either2error,
26  ) where
27  
28 7 paulosilva import Control.MonadOr
29 1 paulosilva import Control.Monad.Error
30  
31 -------------------------------------------------------------------------------
32  
33 data GalcError =
34     UnknownError
35   | NoValueError
36   | ImpossibleError
37   | CustomError String
38   | ParsingError String
39   | UnificationError (String, String)
40   | CastingError (String, String)
41   | InferenceError GalcError String
42   | ReferenceError String
43   | MultiDefError String
44   | ModuleFileError String
45   | ModuleRefError String
46   | DerivationError
47   | ModeError
48   | NoProofError
49   | ExistingRefError String
50   | QedError String String
51   | NoOrderSetError
52 7 paulosilva   | RewriteError String
53   | EqualityError
54   | NestedError GalcError
55   | DecomposeError String String
56 1 paulosilva  
57 -------------------------------------------------------------------------------
58  
59 instance Show GalcError where
60   show = showGalcError
61  
62 -------------------------------------------------------------------------------
63  
64 instance Error GalcError where
65   noMsg = UnknownError
66   strMsg = CustomError
67  
68 -------------------------------------------------------------------------------
69  
70 instance MonadError GalcError [] where
71   throwError _ = []
72   catchError [] f = f NoValueError
73   catchError x@(_:_) _ = x
74  
75 -------------------------------------------------------------------------------
76  
77 7 paulosilva instance MonadOr (Either GalcError) where
78   morelse (Left _) b = b
79   morelse a _ = a
80  
81 -------------------------------------------------------------------------------
82  
83 1 paulosilva maybe2error :: MonadError GalcError m => GalcError -> Maybe a -> m a
84 maybe2error e Nothing  = throwError e
85 maybe2error _ (Just a) = return a
86  
87 -------------------------------------------------------------------------------
88  
89 list2error :: MonadError GalcError m => GalcError -> [a] -> m a
90 list2error e []    = throwError e
91 list2error _ (x:_) = return x
92  
93 -------------------------------------------------------------------------------
94  
95 either2error :: (Show e, MonadError GalcError m)
96              => (e -> GalcError) -> Either e a -> m a
97 either2error f (Left e)  = throwError $ f e
98 either2error _ (Right v) = return v
99  
100 -------------------------------------------------------------------------------
101  
102 showGalcError :: GalcError -> String
103 7 paulosilva showGalcError UnknownError =
104   "Unknown error!"
105 showGalcError NoValueError =
106   "No values found"
107 showGalcError ImpossibleError =
108   "The impossible has happened!"
109 1 paulosilva showGalcError (CustomError err) = err
110 7 paulosilva showGalcError (ParsingError err) =
111   "Parsing error:\n" ++ err
112 1 paulosilva showGalcError (UnificationError (s1, s2)) =
113   "Unification error\nCannot unify " ++ s1 ++ " and " ++ s2
114 showGalcError (CastingError (s1, s2)) =
115   "Cannot cast " ++ s1 ++ " to " ++ s2
116 showGalcError (InferenceError err s) =
117 7 paulosilva   "Error in type inference:\n" ++ showGalcError err ++ "\n" ++ s
118 1 paulosilva showGalcError (ReferenceError err) =
119   "Invalid reference: " ++ err
120 showGalcError (MultiDefError err) =
121   "Multiple definitions: " ++ err
122 7 paulosilva showGalcError (ModuleFileError err) =
123   "Error opening file: " ++ err ++ ".gal"
124 showGalcError DerivationError =
125   "Inversion not expected"
126 showGalcError ModeError =
127   "Command not available in this mode"
128 showGalcError (ModuleRefError err) =
129   "Invalide module name: " ++ err
130 showGalcError NoProofError =
131   "Currently there is no proof"
132 showGalcError (ExistingRefError err) =
133   "Existing reference: " ++ err
134 showGalcError (QedError s1 s2) =
135   "Cannot equalize: " ++ s1 ++ " and " ++ s2
136 showGalcError (NoOrderSetError) =
137   "No order currently set"
138 showGalcError (RewriteError s) =
139   "Cannot rewrite: " ++ s
140 showGalcError EqualityError =
141   "Types are not equal"
142 showGalcError (NestedError e) =
143   showGalcError e
144 showGalcError (DecomposeError s1 s2) =
145   "Cannot match types: " ++ s1 ++ " and " ++ s2
146 1 paulosilva -------------------------------------------------------------------------------
147  

Theme by Vikram Singh | Powered by WebSVN v2.3.3