{-# LANGUAGE LambdaCase #-} module Main (main) where import Control.Monad ((<$!>)) import qualified System.Environment as Env import qualified Language.Brainfuck as Brainfuck import qualified Data.Text as Text import qualified Data.Text.IO as TextIO import qualified Data.Vector as Vector import qualified Language.Brainfuck.Instruction.Compressed as CompressedInstruction import qualified Language.Brainfuck.Instruction.Extended as ExtendedInstruction dumpVector :: Show a => FilePath -> Vector.Vector a -> IO () dumpVector path = TextIO.writeFile path . Text.unlines . map (Text.pack . show) . Vector.toList main :: IO () main = do programFile <- Env.getArgs >>= \case [x] -> pure x _ -> error "usage: [program] source.bf" instructions <- (Brainfuck.parse <$!> TextIO.readFile programFile) >>= \case Left failure -> error $ show failure Right x -> pure x dumpVector "native.bf" instructions let compressed = CompressedInstruction.compress instructions dumpVector "compressed.bf" compressed let extended = ExtendedInstruction.parse compressed dumpVector "extended.bf" extended