packages feed

Javav-0.0.1: Language/Java/Javav.hs

module Language.Java.Javav where


import System.IO
import System.IO.Error
import Data.Maybe
import Control.Arrow

type Version =
  String

versions ::
  [((Char, Char), Version)]
versions =
  [ (('\NUL', '2'), "1.6 (50.0 0x32)")
  , (('\NUL', '1'), "1.5 (49.0 0x31)")
  , (('\NUL', '0'), "1.4 (48.0 0x30)")
  , (('\NUL', '/'), "1.3 (47.0 0x29)")
  , (('\NUL', '.'), "1.2 (46.0 0x28)")
  , (('\NUL', '-'), "1.1 (45.0 0x28)")
  ]

type Error =
  String

alreadyInUseError ::
  Error
alreadyInUseError =
  "-u-"

doesNotExistError ::
  Error
doesNotExistError =
  "-e-"

permissionError ::
  Error
permissionError =
  "-p-"

unknownError ::
  Error
unknownError =
  "-?-"

handleError ::
  IOError
  -> Error
handleError e =
  let err = first ($e) `fmap`
              [ (isAlreadyInUseError, alreadyInUseError)
              , (isDoesNotExistError, doesNotExistError)
              , (isPermissionError  , permissionError)
              ]
  in unknownError `fromMaybe` lookup True err

versionOutput ::
  Char
  -> Char
  -> Version
versionOutput c1 c2 =
  "-?-" `fromMaybe` lookup (c1, c2) versions

version ::
  FilePath
  -> IO Version
version n =
  (withBinaryFile n ReadMode (\h ->
    do hSeek h AbsoluteSeek 6
       c1 <- hGetChar h
       hSeek h AbsoluteSeek 7
       c2 <- hGetChar h
       return (versionOutput c1 c2))) `catch`
  (return . handleError)

version' ::
  [FilePath]
  -> IO [Version]
version' =
  mapM version

printv ::
  [FilePath]
  -> IO ()
printv n =
  do s <- version' n
     mapM_ (\(t, o) -> putStrLn (t ++ ' ' : o)) (zip s n)