bf-optimize/app/Main.hs

33 lines
1.1 KiB
Haskell

{-# 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