hacking around and maybe I can make state suck less?
This commit is contained in:
		
						commit
						f4b52f0958
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| .stack-work/ | ||||
| *~ | ||||
							
								
								
									
										9
									
								
								app/Main.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/Main.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| module Main where | ||||
| 
 | ||||
| import TuringHS | ||||
| 
 | ||||
| main :: IO () | ||||
| main = do | ||||
|   input <- readFile "helloworld.txt" | ||||
|   putStrLn "Running the program!" | ||||
|   interpret (compile input) | ||||
							
								
								
									
										35
									
								
								helloworld.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								helloworld.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| This program prints "Hello World!" and a newline to the screen, its | ||||
| length is 106 active command characters (it is not the shortest) | ||||
| ++++++++               Set Cell #0 to 8 | ||||
| [ | ||||
|     >++++               Add 4 to Cell #1; this will always set Cell #1 to 4 | ||||
|     [                   as the cell will be cleared by the loop | ||||
|         >++             Add 2 to Cell #2 | ||||
|         >+++            Add 3 to Cell #3 | ||||
|         >+++            Add 3 to Cell #4 | ||||
|         >+              Add 1 to Cell #5 | ||||
|         <<<<-           Decrement the loop counter in Cell #1 | ||||
|     ]                   Loop until Cell #1 is zero; number of iterations is 4 | ||||
|     >+                  Add 1 to Cell #2 | ||||
|     >+                  Add 1 to Cell #3 | ||||
|     >-                  Subtract 1 from Cell #4 | ||||
|     >>+                 Add 1 to Cell #6 | ||||
|     [<]                 Move back to the first zero cell you find; this will | ||||
|                         be Cell #1 which was cleared by the previous loop | ||||
|     <-                  Decrement the loop Counter in Cell #0 | ||||
| ]                       Loop until Cell #0 is zero; number of iterations is 8 | ||||
| 
 | ||||
| The result of this is: | ||||
| Cell no :   0   1   2   3   4   5   6 | ||||
| Contents:   0   0  72 104  88  32   8 | ||||
| Pointer :   ^ | ||||
| 
 | ||||
| >>.                     Cell #2 has value 72 which is 'H' | ||||
| >---.                   Subtract 3 from Cell #3 to get 101 which is 'e' | ||||
| +++++++..+++.           Likewise for 'llo' from Cell #3 | ||||
| >>.                     Cell #5 is 32 for the space | ||||
| <-.                     Subtract 1 from Cell #4 for 87 to give a 'W' | ||||
| <.                      Cell #3 was set to 'o' from the end of 'Hello' | ||||
| +++.------.--------.    Cell #3 for 'rl' and 'd' | ||||
| >>+.                    Add 1 to Cell #5 gives us an exclamation point | ||||
| >++.                    And finally a newline from Cell #6 | ||||
							
								
								
									
										10
									
								
								hie.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								hie.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| cradle: | ||||
|   stack: | ||||
|     - path: "./src" | ||||
|       component: "turing-hs:lib" | ||||
| 
 | ||||
|     - path: "./app/Main.hs" | ||||
|       component: "turing-hs:exe:turing" | ||||
| 
 | ||||
|     - path: "./test" | ||||
|       component: "turing-hs:test:turing-hs-test" | ||||
							
								
								
									
										91
									
								
								package.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								package.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,91 @@ | ||||
| name:                turing-hs | ||||
| version:             0.1.0.0 | ||||
| 
 | ||||
| extra-source-files: | ||||
| - README.md | ||||
| 
 | ||||
| dependencies: | ||||
| - base >= 4.7 && < 5 | ||||
| 
 | ||||
| library: | ||||
|   source-dirs: src | ||||
| 
 | ||||
| executables: | ||||
|   turing: | ||||
|     main: Main.hs | ||||
|     source-dirs: app | ||||
|     ghc-options: | ||||
|       - -threaded | ||||
|       - -rtsopts | ||||
|       - -with-rtsopts=-N | ||||
|     dependencies: | ||||
|       - turing-hs | ||||
| 
 | ||||
| tests: | ||||
|   turing-hs-test: | ||||
|     main: Spec.hs | ||||
|     source-dirs: test | ||||
|     ghc-options: | ||||
|       - -threaded | ||||
|       - -rtsopts | ||||
|       - -with-rtsopts=-N | ||||
|     dependencies: | ||||
|       - turing-hs | ||||
| 
 | ||||
| ghc-options: | ||||
|   - -Wall | ||||
|   - -Werror | ||||
|   - -Wcompat | ||||
|   - -Widentities | ||||
|   - -Wincomplete-patterns | ||||
|   - -Wincomplete-record-updates | ||||
|   - -Wincomplete-uni-patterns | ||||
|   - -Wmissing-deriving-strategies | ||||
|   - -Wmissing-home-modules | ||||
|   - -Wname-shadowing | ||||
|   - -Wpartial-fields | ||||
|   - -Wredundant-constraints | ||||
|   - -Wunused-packages | ||||
|   - -Wunused-type-patterns | ||||
| 
 | ||||
| default-extensions: | ||||
|   - BangPatterns | ||||
|   - BinaryLiterals | ||||
|   - BlockArguments | ||||
|   - ConstraintKinds | ||||
|   - DataKinds | ||||
|   - DefaultSignatures | ||||
|   - DeriveDataTypeable | ||||
|   - DeriveFoldable | ||||
|   - DeriveFunctor | ||||
|   - DeriveGeneric | ||||
|   - DeriveTraversable | ||||
|   - DerivingStrategies | ||||
|   - DoAndIfThenElse | ||||
|   - EmptyDataDecls | ||||
|   - ExistentialQuantification | ||||
|   - FlexibleContexts | ||||
|   - FlexibleInstances | ||||
|   - FunctionalDependencies | ||||
|   - GADTs | ||||
|   - GeneralizedNewtypeDeriving | ||||
|   - InstanceSigs | ||||
|   - KindSignatures | ||||
|   - LambdaCase | ||||
|   - MultiParamTypeClasses | ||||
|   - MultiWayIf | ||||
|   - NamedFieldPuns | ||||
|   - OverloadedStrings | ||||
|   - PartialTypeSignatures | ||||
|   - PatternGuards | ||||
|   - PatternSynonyms | ||||
|   - PolyKinds | ||||
|   - RankNTypes | ||||
|   - RecordWildCards | ||||
|   - ScopedTypeVariables | ||||
|   - StandaloneDeriving | ||||
|   - TemplateHaskell | ||||
|   - TupleSections | ||||
|   - TypeFamilies | ||||
|   - TypeSynonymInstances | ||||
|   - ViewPatterns | ||||
							
								
								
									
										10
									
								
								src/TuringHS.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/TuringHS.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| module TuringHS | ||||
|   ( module TuringHS.Compiler, | ||||
|     module TuringHS.Operation, | ||||
|     module TuringHS.Interpreter, | ||||
|   ) | ||||
| where | ||||
| 
 | ||||
| import TuringHS.Compiler | ||||
| import TuringHS.Interpreter | ||||
| import TuringHS.Operation | ||||
							
								
								
									
										18
									
								
								src/TuringHS/Compiler.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/TuringHS/Compiler.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| module TuringHS.Compiler where | ||||
| 
 | ||||
| import TuringHS.Operation | ||||
| 
 | ||||
| compile :: String -> [Operation] | ||||
| compile = go [] | ||||
|   where | ||||
|     go ops (c : cs) = case c of | ||||
|       '<' -> go (Backward : ops) cs | ||||
|       '>' -> go (Forward : ops) cs | ||||
|       '+' -> go (Increment : ops) cs | ||||
|       '-' -> go (Decrement : ops) cs | ||||
|       '.' -> go (Put : ops) cs | ||||
|       ',' -> go (Get : ops) cs | ||||
|       '[' -> go (JumpForward : ops) cs | ||||
|       ']' -> go (JumpBackward : ops) cs | ||||
|       _ -> go ops cs | ||||
|     go ops [] = reverse ops | ||||
							
								
								
									
										210
									
								
								src/TuringHS/Interpreter.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								src/TuringHS/Interpreter.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,210 @@ | ||||
| {-# LANGUAGE TupleSections #-} | ||||
| 
 | ||||
| module TuringHS.Interpreter where | ||||
| 
 | ||||
| import Control.Monad | ||||
| import TuringHS.Operation | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| -- Wrapping increment/decrement | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| increment :: (Eq n, Bounded n, Enum n) => n -> n | ||||
| increment x | ||||
|   | x == maxBound = minBound | ||||
|   | otherwise = succ x | ||||
| 
 | ||||
| decrement :: (Eq n, Bounded n, Enum n) => n -> n | ||||
| decrement x | ||||
|   | x == minBound = maxBound | ||||
|   | otherwise = pred x | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| -- State Monad | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| newtype State s m a = State {runState :: s -> m (a, s)} | ||||
| 
 | ||||
| state :: (s -> m (a, s)) -> State s m a | ||||
| state = State | ||||
| 
 | ||||
| get :: (Monad m) => State s m s | ||||
| get = State \s -> return (s, s) | ||||
| 
 | ||||
| put :: (Monad m) => s -> State s m () | ||||
| put s = State \_ -> return ((), s) | ||||
| 
 | ||||
| instance (Monad m) => Functor (State s m) where | ||||
|   fmap f (State g) = State \s0 -> do | ||||
|     (x1, s1) <- g s0 | ||||
|     return (f x1, s1) | ||||
| 
 | ||||
| instance (Monad m) => Applicative (State s m) where | ||||
|   pure x = State \s -> pure (x, s) | ||||
|   State f <*> State g = State \s0 -> do | ||||
|     (f1, s1) <- f s0 | ||||
|     (x2, s2) <- g s1 | ||||
|     return (f1 x2, s2) | ||||
| 
 | ||||
| instance (Monad m) => Monad (State s m) where | ||||
|   State h >>= f = State \s0 -> do | ||||
|     (x1, s1) <- h s0 | ||||
|     let State g = f x1 | ||||
|     g s1 | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| -- Tape Deck | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| data TapeDeck a = TapeDeck [a] [a] | ||||
| 
 | ||||
| tapeHead :: TapeDeck a -> a | ||||
| tapeHead = \case | ||||
|   TapeDeck (x : _) _ -> x | ||||
|   _ -> error "Empty tape!" | ||||
| 
 | ||||
| headOption :: TapeDeck a -> Maybe a | ||||
| headOption = \case | ||||
|   TapeDeck (x : _) _ -> Just x | ||||
|   _ -> Nothing | ||||
| 
 | ||||
| withHead :: (a -> a) -> TapeDeck a -> TapeDeck a | ||||
| withHead f = \case | ||||
|   TapeDeck (x : front) back -> TapeDeck (f x : front) back | ||||
|   x -> x | ||||
| 
 | ||||
| forwardExtend :: (Bounded a) => TapeDeck a -> TapeDeck a | ||||
| forwardExtend = \case | ||||
|   TapeDeck (x : front) back -> TapeDeck front (x : back) | ||||
|   TapeDeck [] back -> TapeDeck [minBound] back | ||||
| 
 | ||||
| backwardExtend :: (Bounded a) => TapeDeck a -> TapeDeck a | ||||
| backwardExtend = \case | ||||
|   TapeDeck front (x : back) -> TapeDeck (x : front) back | ||||
|   TapeDeck front [] -> TapeDeck (minBound : front) [] | ||||
| 
 | ||||
| forward :: TapeDeck a -> TapeDeck a | ||||
| forward = \case | ||||
|   TapeDeck (x : front) back -> TapeDeck front (x : back) | ||||
|   _ -> error "Read past the end of the tape!" | ||||
| 
 | ||||
| backward :: TapeDeck a -> TapeDeck a | ||||
| backward = \case | ||||
|   TapeDeck front (x : back) -> TapeDeck (x : front) back | ||||
|   _ -> error "Read past the start of the tape!" | ||||
| 
 | ||||
| endOfTape :: TapeDeck a -> Bool | ||||
| endOfTape = \case | ||||
|   TapeDeck (_ : _) _ -> False | ||||
|   _ -> True | ||||
| 
 | ||||
| ------------------------------------------------------------------------------- | ||||
| -- Turing Machine | ||||
| ------------------------------------------------------------------------------- | ||||
| 
 | ||||
| class (Monad m) => TuringEffect m n where | ||||
|   readData :: m n | ||||
|   storeData :: n -> m () | ||||
|   buffer :: m [n] | ||||
| 
 | ||||
| data TuringMachine a = TuringMachine | ||||
|   { turingOps :: TapeDeck Operation, | ||||
|     turingTape :: TapeDeck a, | ||||
|     turingLoop :: Int | ||||
|   } | ||||
| 
 | ||||
| runMachine :: forall m n. (TuringEffect m n, Eq n, Enum n, Bounded n) => [Operation] -> m [n] | ||||
| runMachine ops = runState step machine >> buffer | ||||
|   where | ||||
|     machine :: TuringMachine n | ||||
|     machine = | ||||
|       TuringMachine | ||||
|         { turingOps = TapeDeck ops [], | ||||
|           turingTape = TapeDeck [minBound] [], | ||||
|           turingLoop = 0 | ||||
|         } | ||||
| 
 | ||||
| step :: (TuringEffect m n, Eq n, Enum n, Bounded n) => State (TuringMachine n) m () | ||||
| step = tryRunOp . turingOps =<< get | ||||
|   where | ||||
|     tryRunOp ops | ||||
|       | endOfTape ops = return () | ||||
|       | otherwise = runOp (tapeHead ops) >> step | ||||
|     runOp = \case | ||||
|       Forward -> forwardOp | ||||
|       Backward -> backwardOp | ||||
|       Increment -> incrementOp | ||||
|       Decrement -> decrementOp | ||||
|       Put -> putOp | ||||
|       Get -> getOp | ||||
|       JumpForward -> jumpForwardOp | ||||
|       JumpBackward -> jumpBackwardOp | ||||
| 
 | ||||
| nextOperation :: (Monad m) => State (TuringMachine n) m (Maybe Operation) | ||||
| nextOperation = do | ||||
|   ops <- turingOps <$> get | ||||
|   return | ||||
|     if endOfTape ops | ||||
|       then Nothing | ||||
|       else Just $ tapeHead ops | ||||
| 
 | ||||
| forwardOp :: (Bounded n, Monad m) => State (TuringMachine n) m () | ||||
| forwardOp = withTape forwardExtend | ||||
| 
 | ||||
| backwardOp :: (Bounded n, Monad m) => State (TuringMachine n) m () | ||||
| backwardOp = withTape backwardExtend | ||||
| 
 | ||||
| withTape :: (Monad m) => (TapeDeck n -> TapeDeck n) -> State (TuringMachine n) m () | ||||
| withTape f = do | ||||
|   machine <- get | ||||
|   let turingTape' = f $ turingTape machine | ||||
|   put $ machine {turingTape = turingTape'} | ||||
| 
 | ||||
| incrementOp :: (Monad m, Eq n, Enum n, Bounded n) => State (TuringMachine n) m () | ||||
| incrementOp = withTapeHead increment | ||||
| 
 | ||||
| decrementOp :: (Monad m, Eq n, Enum n, Bounded n) => State (TuringMachine n) m () | ||||
| decrementOp = withTapeHead decrement | ||||
| 
 | ||||
| withTapeHead :: (Monad m) => (n -> n) -> State (TuringMachine n) m () | ||||
| withTapeHead f = do | ||||
|   machine <- get | ||||
|   let turingTape' = withHead f (turingTape machine) | ||||
|   put $ machine {turingTape = turingTape'} | ||||
| 
 | ||||
| putOp :: State (TuringMachine n) m () | ||||
| putOp = undefined | ||||
| 
 | ||||
| getOp :: State (TuringMachine n) m () | ||||
| getOp = undefined | ||||
| 
 | ||||
| jumpForwardOp :: (Monad m, Eq n, Bounded n) => State (TuringMachine n) m () | ||||
| jumpForwardOp = do | ||||
|   withLoop succ | ||||
|   x <- readHead | ||||
|   when (x /= minBound) undefined -- skip to next matching jump backward op | ||||
| 
 | ||||
| jumpBackwardOp :: (Monad m, Eq n, Bounded n) => State (TuringMachine n) m () | ||||
| jumpBackwardOp = do | ||||
|   withLoop pred | ||||
|   x <- readHead | ||||
|   when (x /= minBound) undefined -- skip back to the previous matching jump backward op | ||||
| 
 | ||||
| readHead :: (Monad m) => State (TuringMachine n) m n | ||||
| readHead = tapeHead . turingTape <$> get | ||||
| 
 | ||||
| getLoopLevel :: (Monad m) => State (TuringMachine n) m Int | ||||
| getLoopLevel = turingLoop <$> get | ||||
| 
 | ||||
| withLoop :: (Monad m) => (Int -> Int) -> State (TuringMachine n) m () | ||||
| withLoop f = do | ||||
|   machine <- get | ||||
|   let loop = turingLoop machine | ||||
|   put $ machine {turingLoop = f loop} | ||||
|   return () | ||||
| 
 | ||||
| withOps :: (Monad m) => (TapeDeck Operation -> TapeDeck Operation) -> State (TuringMachine n) m () | ||||
| withOps f = do | ||||
|   machine <- get | ||||
|   let turingOps' = f $ turingOps machine | ||||
|   put $ machine {turingOps = turingOps'} | ||||
							
								
								
									
										25
									
								
								src/TuringHS/Operation.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/TuringHS/Operation.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| module TuringHS.Operation where | ||||
| 
 | ||||
| data Operation | ||||
|   = -- | ">" Increment the data pointer (to point to the next cell to the right). | ||||
|     Forward | ||||
|   | -- | "<" Decrement the data pointer (to point to the next cell to the left). | ||||
|     Backward | ||||
|   | -- | "+" Increment (increase by one) the byte at the data pointer. | ||||
|     Increment | ||||
|   | -- | "-" Decrement (decrease by one) the byte at the data pointer. | ||||
|     Decrement | ||||
|   | -- | "." Output the byte at the data pointer. | ||||
|     Put | ||||
|   | -- | "," Accept one byte of input, storing its value in the byte at the data | ||||
|     -- pointer. | ||||
|     Get | ||||
|   | -- | "[" If the byte at the data pointer is zero, then instead of moving the | ||||
|     -- instruction pointer forward to the next command, jump it forward to the | ||||
|     -- command after the matching ] command. | ||||
|     JumpForward | ||||
|   | -- | "]" If the byte at the data pointer is nonzero, then instead of moving | ||||
|     -- the instruction pointer forward to the next command, jump it back to the | ||||
|     -- command after the matching [ command. | ||||
|     JumpBackward | ||||
|   deriving stock (Eq, Show) | ||||
							
								
								
									
										67
									
								
								stack.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								stack.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | ||||
| # This file was automatically generated by 'stack init' | ||||
| # | ||||
| # Some commonly used options have been documented as comments in this file. | ||||
| # For advanced use and comprehensive documentation of the format, please see: | ||||
| # https://docs.haskellstack.org/en/stable/yaml_configuration/ | ||||
| 
 | ||||
| # Resolver to choose a 'specific' stackage snapshot or a compiler version. | ||||
| # A snapshot resolver dictates the compiler version and the set of packages | ||||
| # to be used for project dependencies. For example: | ||||
| # | ||||
| # resolver: lts-3.5 | ||||
| # resolver: nightly-2015-09-21 | ||||
| # resolver: ghc-7.10.2 | ||||
| # | ||||
| # The location of a snapshot can be provided as a file or url. Stack assumes | ||||
| # a snapshot provided as a file might change, whereas a url resource does not. | ||||
| # | ||||
| # resolver: ./custom-snapshot.yaml | ||||
| # resolver: https://example.com/snapshots/2018-01-01.yaml | ||||
| resolver: | ||||
|   url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/5.yaml | ||||
| 
 | ||||
| # User packages to be built. | ||||
| # Various formats can be used as shown in the example below. | ||||
| # | ||||
| # packages: | ||||
| # - some-directory | ||||
| # - https://example.com/foo/bar/baz-0.0.2.tar.gz | ||||
| #   subdirs: | ||||
| #   - auto-update | ||||
| #   - wai | ||||
| packages: | ||||
| - . | ||||
| # Dependency packages to be pulled from upstream that are not in the resolver. | ||||
| # These entries can reference officially published versions as well as | ||||
| # forks / in-progress versions pinned to a git hash. For example: | ||||
| # | ||||
| # extra-deps: | ||||
| # - acme-missiles-0.3 | ||||
| # - git: https://github.com/commercialhaskell/stack.git | ||||
| #   commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a | ||||
| # | ||||
| # extra-deps: [] | ||||
| 
 | ||||
| # Override default flag values for local packages and extra-deps | ||||
| # flags: {} | ||||
| 
 | ||||
| # Extra package databases containing global packages | ||||
| # extra-package-dbs: [] | ||||
| 
 | ||||
| # Control whether we use the GHC we find on the path | ||||
| # system-ghc: true | ||||
| # | ||||
| # Require a specific version of stack, using version ranges | ||||
| # require-stack-version: -any # Default | ||||
| # require-stack-version: ">=2.7" | ||||
| # | ||||
| # Override the architecture used by stack, especially useful on Windows | ||||
| # arch: i386 | ||||
| # arch: x86_64 | ||||
| # | ||||
| # Extra directories used by stack for building | ||||
| # extra-include-dirs: [/path/to/dir] | ||||
| # extra-lib-dirs: [/path/to/dir] | ||||
| # | ||||
| # Allow a newer minor version of GHC than the snapshot specifies | ||||
| # compiler-check: newer-minor | ||||
							
								
								
									
										13
									
								
								stack.yaml.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								stack.yaml.lock
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| # This file was autogenerated by Stack. | ||||
| # You should not edit this file by hand. | ||||
| # For more information, please see the documentation at: | ||||
| #   https://docs.haskellstack.org/en/stable/lock_files | ||||
| 
 | ||||
| packages: [] | ||||
| snapshots: | ||||
| - completed: | ||||
|     size: 585817 | ||||
|     url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/5.yaml | ||||
|     sha256: 22d24d0dacad9c1450b9a174c28d203f9bb482a2a8da9710a2f2a9f4afee2887 | ||||
|   original: | ||||
|     url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/5.yaml | ||||
							
								
								
									
										1
									
								
								test/Spec.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/Spec.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| {-# OPTIONS_GHC -F -pgmF hspec-discover #-} | ||||
							
								
								
									
										174
									
								
								turing-hs.cabal
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								turing-hs.cabal
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,174 @@ | ||||
| cabal-version: 1.12 | ||||
| 
 | ||||
| -- This file has been generated from package.yaml by hpack version 0.34.4. | ||||
| -- | ||||
| -- see: https://github.com/sol/hpack | ||||
| 
 | ||||
| name:           turing-hs | ||||
| version:        0.1.0.0 | ||||
| build-type:     Simple | ||||
| extra-source-files: | ||||
|     README.md | ||||
| 
 | ||||
| library | ||||
|   exposed-modules: | ||||
|       TuringHS | ||||
|       TuringHS.Compiler | ||||
|       TuringHS.Interpreter | ||||
|       TuringHS.Operation | ||||
|   other-modules: | ||||
|       Paths_turing_hs | ||||
|   hs-source-dirs: | ||||
|       src | ||||
|   default-extensions: | ||||
|       BangPatterns | ||||
|       BinaryLiterals | ||||
|       BlockArguments | ||||
|       ConstraintKinds | ||||
|       DataKinds | ||||
|       DefaultSignatures | ||||
|       DeriveDataTypeable | ||||
|       DeriveFoldable | ||||
|       DeriveFunctor | ||||
|       DeriveGeneric | ||||
|       DeriveTraversable | ||||
|       DerivingStrategies | ||||
|       DoAndIfThenElse | ||||
|       EmptyDataDecls | ||||
|       ExistentialQuantification | ||||
|       FlexibleContexts | ||||
|       FlexibleInstances | ||||
|       FunctionalDependencies | ||||
|       GADTs | ||||
|       GeneralizedNewtypeDeriving | ||||
|       InstanceSigs | ||||
|       KindSignatures | ||||
|       LambdaCase | ||||
|       MultiParamTypeClasses | ||||
|       MultiWayIf | ||||
|       NamedFieldPuns | ||||
|       OverloadedStrings | ||||
|       PartialTypeSignatures | ||||
|       PatternGuards | ||||
|       PatternSynonyms | ||||
|       PolyKinds | ||||
|       RankNTypes | ||||
|       RecordWildCards | ||||
|       ScopedTypeVariables | ||||
|       StandaloneDeriving | ||||
|       TemplateHaskell | ||||
|       TupleSections | ||||
|       TypeFamilies | ||||
|       TypeSynonymInstances | ||||
|       ViewPatterns | ||||
|   ghc-options: -Wall -Werror -Wcompat -Widentities -Wincomplete-patterns -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wmissing-home-modules -Wname-shadowing -Wpartial-fields -Wredundant-constraints -Wunused-packages -Wunused-type-patterns | ||||
|   build-depends: | ||||
|       base >=4.7 && <5 | ||||
|   default-language: Haskell2010 | ||||
| 
 | ||||
| executable turing | ||||
|   main-is: Main.hs | ||||
|   other-modules: | ||||
|       Paths_turing_hs | ||||
|   hs-source-dirs: | ||||
|       app | ||||
|   default-extensions: | ||||
|       BangPatterns | ||||
|       BinaryLiterals | ||||
|       BlockArguments | ||||
|       ConstraintKinds | ||||
|       DataKinds | ||||
|       DefaultSignatures | ||||
|       DeriveDataTypeable | ||||
|       DeriveFoldable | ||||
|       DeriveFunctor | ||||
|       DeriveGeneric | ||||
|       DeriveTraversable | ||||
|       DerivingStrategies | ||||
|       DoAndIfThenElse | ||||
|       EmptyDataDecls | ||||
|       ExistentialQuantification | ||||
|       FlexibleContexts | ||||
|       FlexibleInstances | ||||
|       FunctionalDependencies | ||||
|       GADTs | ||||
|       GeneralizedNewtypeDeriving | ||||
|       InstanceSigs | ||||
|       KindSignatures | ||||
|       LambdaCase | ||||
|       MultiParamTypeClasses | ||||
|       MultiWayIf | ||||
|       NamedFieldPuns | ||||
|       OverloadedStrings | ||||
|       PartialTypeSignatures | ||||
|       PatternGuards | ||||
|       PatternSynonyms | ||||
|       PolyKinds | ||||
|       RankNTypes | ||||
|       RecordWildCards | ||||
|       ScopedTypeVariables | ||||
|       StandaloneDeriving | ||||
|       TemplateHaskell | ||||
|       TupleSections | ||||
|       TypeFamilies | ||||
|       TypeSynonymInstances | ||||
|       ViewPatterns | ||||
|   ghc-options: -Wall -Werror -Wcompat -Widentities -Wincomplete-patterns -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wmissing-home-modules -Wname-shadowing -Wpartial-fields -Wredundant-constraints -Wunused-packages -Wunused-type-patterns -threaded -rtsopts -with-rtsopts=-N | ||||
|   build-depends: | ||||
|       base >=4.7 && <5 | ||||
|     , turing-hs | ||||
|   default-language: Haskell2010 | ||||
| 
 | ||||
| test-suite turing-hs-test | ||||
|   type: exitcode-stdio-1.0 | ||||
|   main-is: Spec.hs | ||||
|   other-modules: | ||||
|       Paths_turing_hs | ||||
|   hs-source-dirs: | ||||
|       test | ||||
|   default-extensions: | ||||
|       BangPatterns | ||||
|       BinaryLiterals | ||||
|       BlockArguments | ||||
|       ConstraintKinds | ||||
|       DataKinds | ||||
|       DefaultSignatures | ||||
|       DeriveDataTypeable | ||||
|       DeriveFoldable | ||||
|       DeriveFunctor | ||||
|       DeriveGeneric | ||||
|       DeriveTraversable | ||||
|       DerivingStrategies | ||||
|       DoAndIfThenElse | ||||
|       EmptyDataDecls | ||||
|       ExistentialQuantification | ||||
|       FlexibleContexts | ||||
|       FlexibleInstances | ||||
|       FunctionalDependencies | ||||
|       GADTs | ||||
|       GeneralizedNewtypeDeriving | ||||
|       InstanceSigs | ||||
|       KindSignatures | ||||
|       LambdaCase | ||||
|       MultiParamTypeClasses | ||||
|       MultiWayIf | ||||
|       NamedFieldPuns | ||||
|       OverloadedStrings | ||||
|       PartialTypeSignatures | ||||
|       PatternGuards | ||||
|       PatternSynonyms | ||||
|       PolyKinds | ||||
|       RankNTypes | ||||
|       RecordWildCards | ||||
|       ScopedTypeVariables | ||||
|       StandaloneDeriving | ||||
|       TemplateHaskell | ||||
|       TupleSections | ||||
|       TypeFamilies | ||||
|       TypeSynonymInstances | ||||
|       ViewPatterns | ||||
|   ghc-options: -Wall -Werror -Wcompat -Widentities -Wincomplete-patterns -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wmissing-home-modules -Wname-shadowing -Wpartial-fields -Wredundant-constraints -Wunused-packages -Wunused-type-patterns -threaded -rtsopts -with-rtsopts=-N | ||||
|   build-depends: | ||||
|       base >=4.7 && <5 | ||||
|     , turing-hs | ||||
|   default-language: Haskell2010 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user