aboutsummaryrefslogtreecommitdiff
path: root/src/Assignment.hs
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