@@ -3,24 +3,11 @@ module TutorialD.Interpreter.TransactionGraphOperator where
3import TutorialD.Interpreter.Base
3import TutorialD.Interpreter.Base
4import Text.Parsec
4import Text.Parsec
5import Text.Parsec.String
5import Text.Parsec.String
7import qualified Data.UUID as U
6import qualified Data.UUID as U
8import qualified Data.Text as T
7import qualified Data.Text as T
9−import ProjectM36.Error
10−import ProjectM36.Transaction
11import ProjectM36.TransactionGraph
8import ProjectM36.TransactionGraph
12−import ProjectM36.TransactionGraph.Show
13import ProjectM36.Relation.Show.Term
9import ProjectM36.Relation.Show.Term
15−--operators which manipulate a transaction graph
16−data TransactionGraphOperator where
17− JumpToHead :: HeadName -> TransactionGraphOperator
18− JumpToTransaction :: U.UUID -> TransactionGraphOperator
19− Branch :: HeadName -> TransactionGraphOperator
20− Commit :: TransactionGraphOperator
21− Rollback :: TransactionGraphOperator
22− ShowGraph :: TransactionGraphOperator
24jumpToHeadP :: Parser TransactionGraphOperator
11jumpToHeadP :: Parser TransactionGraphOperator
25jumpToHeadP = do
12jumpToHeadP = do
26 reservedOp ":jumphead"
13 reservedOp ":jumphead"
@@ -49,7 +36,7 @@ rollbackTransactionP = do
49 reservedOp ":rollback"
36 reservedOp ":rollback"
50 return $ Rollback
37 return $ Rollback
52−showGraphP :: Parser TransactionGraphOperator
39+showGraphP :: Parser ROTransactionGraphOperator
53showGraphP = do
40showGraphP = do
54 reservedOp ":showgraph"
41 reservedOp ":showgraph"
55 return $ ShowGraph
42 return $ ShowGraph
@@ -61,7 +48,9 @@ transactionGraphOpP = do
61 <|> branchTransactionP
48 <|> branchTransactionP
62 <|> commitTransactionP
49 <|> commitTransactionP
63 <|> rollbackTransactionP
50 <|> rollbackTransactionP
52+roTransactionGraphOpP :: Parser ROTransactionGraphOperator
64− <|> showGraphP
53+roTransactionGraphOpP = showGraphP
66uuidP :: Parser U.UUID
55uuidP :: Parser U.UUID
@@ -70,71 +59,6 @@ uuidP = do
70 Nothing -> fail "Invalid uuid string"
59 Nothing -> fail "Invalid uuid string"
71 Just uuid -> return uuid
60 Just uuid -> return uuid
73−-- returns the new "current" transaction, updated graph, and tutorial d result
74−-- the current transaction is not part of the transaction graph until it is committed
75−evalGraphOp :: U.UUID -> DisconnectedTransaction -> TransactionGraph -> TransactionGraphOperator -> Either RelationalError (DisconnectedTransaction, TransactionGraph, TutorialDOperatorResult)
77−--affects only disconncted transaction
78−evalGraphOp _ _ graph (JumpToTransaction jumpUUID) = case transactionForUUID jumpUUID graph of
80− Right parentTrans -> Right (newTrans, graph, QuietSuccessResult)
82− newTrans = DisconnectedTransaction jumpUUID (transactionContext parentTrans)
84−-- switch from one head to another
85−-- affects only disconnectedtransaction
86−evalGraphOp _ _ graph (JumpToHead headName) =
87− case transactionForHead headName graph of
88− Just newHeadTransaction -> let disconnectedTrans = newDisconnectedTransaction (transactionUUID newHeadTransaction) (transactionContext newHeadTransaction) in
89− Right (disconnectedTrans, graph, QuietSuccessResult)
90− Nothing -> Left $ NoSuchHeadNameError headName
91−-- add new head pointing to branchPoint
92−-- repoint the disconnected transaction to the new branch commit (with a potentially different disconnected context)
93−-- affects transactiongraph and the disconnectedtransaction is recreated based off the branch
95−evalGraphOp newUUID discon@(DisconnectedTransaction parentUUID disconContext) graph (Branch newBranchName) = case transactionForUUID parentUUID graph of
96− Nothing -> (discon, graph, DisplayErrorResult "Failed to find parent transaction.")
97− Just parentTrans -> case addBranch newBranchName parentTrans graph of
98− Nothing -> (discon, graph, DisplayErrorResult "Failed to add branch.")
99− Just newGraph -> (newDiscon, newGraph, DisplayResult "Branched.")
101− newDiscon = DisconnectedTransaction (transactionUUID parentTrans) disconContext
104−-- create a new commit and add it to the heads
105−-- technically, the new head could be added to an existing commit, but by adding a new commit, the new head is unambiguously linked to a new commit (with a context indentical to its parent)
106−evalGraphOp newUUID (DisconnectedTransaction parentUUID disconContext) graph (Branch newBranchName) = case transactionForUUID parentUUID graph of
107− Left err -> Left err
108− Right parentTrans -> case addBranch newUUID newBranchName parentTrans graph of
109− Left err -> Left err
110− Right (_, newGraph) -> Right (newDiscon, newGraph, QuietSuccessResult)
112− newDiscon = DisconnectedTransaction newUUID disconContext
114−-- add the disconnected transaction to the graph
115−-- affects graph and disconnectedtransaction- the new disconnectedtransaction's parent is the freshly committed transaction
116−evalGraphOp newTransUUID discon@(DisconnectedTransaction parentUUID context) graph Commit = case transactionForUUID parentUUID graph of
117− Left err -> Left err
118− Right parentTransaction -> case headNameForTransaction parentTransaction graph of
119− Nothing -> Left $ TransactionIsNotAHeadError parentUUID
120− Just headName -> case maybeUpdatedGraph of
122− Right (_, updatedGraph) -> Right (newDisconnectedTrans, updatedGraph, QuietSuccessResult)
124− newDisconnectedTrans = newDisconnectedTransaction newTransUUID context
125− maybeUpdatedGraph = addDisconnectedTransaction newTransUUID headName discon graph
127−-- refresh the disconnected transaction, return the same graph
128−evalGraphOp _ (DisconnectedTransaction parentUUID _) graph Rollback = case transactionForUUID parentUUID graph of
129− Left err -> Left err
130− Right parentTransaction -> Right (newDiscon, graph, QuietSuccessResult)
132− newDiscon = newDisconnectedTransaction parentUUID (transactionContext parentTransaction)
134−--display transaction graph as relation
135−evalGraphOp _ discon graph ShowGraph = do
136− graphStr <- graphAsRelation discon graph
137− return (discon, graph, DisplayResult $ showRelation graphStr)
140-- for interpreter-specific operations
64-- for interpreter-specific operations