git @ Cat's Eye Technologies Fountain / 6a550e0
Store no longer depends on Value or Loader. Chris Pressey 1 year, 3 months ago
5 changed file(s) with 27 addition(s) and 19 deletion(s). Raw diff Collapse all Expand all
55 import Language.Fountain.Store
66 import Language.Fountain.Constraint
77 import Language.Fountain.Grammar
8 import Language.Fountain.Loader (constructStore)
89
910
1011 data GenState = Generating String (Store Value)
44 import Text.ParserCombinators.Parsec
55
66 import Language.Fountain.Value
7 import Language.Fountain.Store
78 import Language.Fountain.Grammar
89 import Language.Fountain.Constraint
910
222223 parseConstConstraint text = case parse unifyConst "" text of
223224 Right (UnifyConst v i) -> (v, i)
224225 v -> error ("parseConstConstraint: " ++ show v)
226
227 constructStore :: [String] -> Store Value
228 constructStore [] = empty
229 constructStore (constConstrainer:rest) =
230 let
231 (k, v) = parseConstConstraint constConstrainer
232 in
233 insert k v $ constructStore rest
55 import Language.Fountain.Store
66 import Language.Fountain.Constraint
77 import Language.Fountain.Grammar
8 import Language.Fountain.Loader (constructStore)
89
910
1011 data ParseState = Parsing String (Store Value)
00 module Language.Fountain.Store (
11 Store, empty, fetch, insert, update, updateStore,
2 constructStore, ceval, applyConstraint,
2 ceval, applyConstraint,
33 trace
44 ) where
55
1111
1212 import qualified Data.Map as Map
1313
14 import Language.Fountain.Value
1514 import Language.Fountain.Constraint
16 import Language.Fountain.Loader (parseConstConstraint)
1715
1816
1917 data Store a = Store {
2523 fetch k s = Map.lookup k (store s)
2624 insert k v s = s{ store=Map.insert k v $ store s }
2725 update f k s = s{ store=Map.update f k $ store s }
28
29
30 constructStore :: [String] -> Store Value
31 constructStore [] = empty
32 constructStore (constConstrainer:rest) =
33 let
34 (k, v) = parseConstConstraint constConstrainer
35 in
36 insert k v $ constructStore rest
3726
3827 updateStore :: [Variable] -> [Variable] -> Store a -> Store a -> Store a
3928 updateStore [] [] _sourceStore destStore = destStore
5241 ceval (CVal val) _ = Just val
5342 ceval (CVar v) st = fetch v st
5443
55 applyConstraint :: Constraint Value -> Store Value -> Maybe (Store Value)
44 applyConstraint :: (Show a, Num a, Ord a) => Constraint a -> Store a -> Maybe (Store a)
5645 applyConstraint (UnifyConst v i) st =
5746 case fetch v st of
5847 Just value ->
7160 Just st
7261 applyConstraint (Inc v e) st =
7362 case ceval e st of
74 Just (IntVal delta) ->
75 Just $ update (\(IntVal i) -> Just $ IntVal $ i + delta) v st
63 Just delta ->
64 Just $ update (\i -> Just $ i + delta) v st
7665 Nothing ->
7766 Nothing
7867 applyConstraint (Dec v e) st =
7968 case ceval e st of
80 Just (IntVal delta) ->
81 Just $ update (\(IntVal i) -> Just $ IntVal $ i - delta) v st
69 Just delta ->
70 Just $ update (\i -> Just $ i - delta) v st
8271 Nothing ->
8372 Nothing
8473 applyConstraint (Both c1 c2) st =
9382 applyConstraint (LessThanOrEqual v e) st = applyRelConstraint (<=) v e st
9483 applyConstraint other _state = error ("Can't handle this: " ++ show other)
9584
96 applyRelConstraint :: (Integer -> Integer -> Bool) -> Variable -> CExpr Value -> Store Value -> Maybe (Store Value)
85 applyRelConstraint :: Ord a => (a -> a -> Bool) -> Variable -> CExpr a -> Store a -> Maybe (Store a)
9786 applyRelConstraint op var e st =
9887 case (fetch var st, ceval e st) of
99 (Just (IntVal value), Just (IntVal target)) ->
88 (Just value, Just target) ->
10089 if value `op` target then Just st else Nothing
10190 _ ->
10291 Nothing
44
55 instance Show Value where
66 show (IntVal n) = (show n)
7
8 instance Num Value where
9 (IntVal x) + (IntVal y) = IntVal (x + y)
10 (IntVal x) - (IntVal y) = IntVal (x - y)
11 (IntVal x) * (IntVal y) = IntVal (x * y)
12 abs (IntVal x) = IntVal $ abs x
13 signum (IntVal x) = IntVal $ signum x
14 fromInteger x = IntVal x