blob: 2dc7aefe39632265be508f9a60040951e23463f9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
module Assignment where
import Data.List
import qualified Expr as E
data Assignment
= Variable String E.Expr
| Function String String E.Expr
instance Eq Assignment where
(Variable n1 _) == (Variable n2 _) = n1 == n2
(Function n1 _ _) == (Function n2 _ _) = n1 == n2
_ == _ = False
name :: Assignment -> String
name (Variable n _) = n
name (Function n _ _) = n
-- data Context a = Context { vars :: [Assignment], payload :: a }
type Context = [Assignment]
-- instance Functor Context where
-- fmap f (Context as x) = Context as (f x)
--
-- instance Applicative Context where
-- pure x = Context [] x
-- (Context a1 f) <*> (Context a2 x) = Context (a1 `union` a2) (f x)
--
-- instance Monad Context where
-- return = pure
-- (Context a1 x) >>= f = Context (vars res `union` a1) (payload res)
-- where res = f x
update :: Context -> Assignment -> Context
update context a
| a `elem` context = map replaceIf context
| otherwise = a:context
where replaceIf a' = if a' == a then a else a'
get :: Context -> String -> Maybe Assignment
get context n = case found of [] -> Nothing
[a] -> Just a
where found = filter (\a -> name a == n) context
instance Show Assignment where
show (Variable name e) = name ++ " = " ++ show e
show (Function name arg e) = name ++ "(" ++ arg ++ ") = " ++ show e
|