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)