never executed always true always false
1 module HelVM.HelMA.Automata.BrainFuck.Impl.Flat.TableOfInstructions where
2
3 import HelVM.HelMA.Automata.BrainFuck.Impl.Flat.Instruction
4
5 type HalfTable = FlatTreeInstructionList
6 type Table = (HalfTable , HalfTable)
7 type TableD = Table -> Table
8
9 currentInstruction :: ([a], [a]) -> Maybe a
10 currentInstruction (_ , i : _) = Just i
11 currentInstruction (_ , []) = Nothing
12
13 prevInst :: TableD
14 prevInst (inst : prev , next) = (prev , inst : next)
15 prevInst ([] , _) = error "End of the table"
16
17 nextInst :: TableD
18 nextInst (prev , inst : next) = (inst : prev , next)
19 nextInst (_ , []) = error "End of the table"
20
21 matchPrevJmp :: TableD
22 matchPrevJmp table@(JmpPast : _ , _) = table
23 matchPrevJmp table@(JmpBack : _ , _) = (matchPrevJmp . prevInst . jumpBack) table
24 matchPrevJmp table = jumpBack table
25
26 matchNextJmp :: TableD
27 matchNextJmp table@(_ , JmpBack : _) = nextInst table
28 matchNextJmp table@(_ , JmpPast : _) = (matchNextJmp . jumpPast) table
29 matchNextJmp table = jumpPast table
30
31 jumpPast :: TableD
32 jumpPast = matchNextJmp . nextInst
33
34 jumpBack :: TableD
35 jumpBack = matchPrevJmp . prevInst