packages feed

fortran-src-0.4.2: src/Language/Fortran/Version.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}

-- | Fortran version enum and tools for selecting version for a given file.

module Language.Fortran.Version
  ( FortranVersion(..)
  , fortranVersionAliases
  , selectFortranVersion
  , deduceFortranVersion
  , deduceVersion -- deprecated
  ) where

import           Data.Char (toLower)
import           Data.List (isInfixOf, isSuffixOf, find)

import Data.Data (Data, Typeable)
import GHC.Generics (Generic)

data FortranVersion = Fortran66
                    | Fortran77
                    | Fortran77Extended
                    | Fortran77Legacy
                    | Fortran90
                    | Fortran95
                    | Fortran2003
                    | Fortran2008
                    deriving (Ord, Eq, Data, Typeable, Generic)

instance Show FortranVersion where
  show Fortran66         = "Fortran 66"
  show Fortran77         = "Fortran 77"
  show Fortran77Extended = "Fortran 77 Extended"
  show Fortran77Legacy   = "Fortran 77 Legacy"
  show Fortran90         = "Fortran 90"
  show Fortran95         = "Fortran 95"
  show Fortran2003       = "Fortran 2003"
  show Fortran2008       = "Fortran 2008"

fortranVersionAliases :: [(String, FortranVersion)]
fortranVersionAliases = [ ("66" , Fortran66)
                        , ("77e", Fortran77Extended)
                        , ("77l", Fortran77Legacy)
                        , ("77" , Fortran77)
                        , ("90" , Fortran90)
                        , ("95" , Fortran95)
                        , ("03" , Fortran2003)
                        , ("08" , Fortran2008) ]

selectFortranVersion :: String -> Maybe FortranVersion
selectFortranVersion alias = snd <$> find (\ entry -> fst entry `isInfixOf` map toLower alias) fortranVersionAliases

-- | Deduce the 'FortranVersion' from a 'FilePath' using extension.
--
-- Defaults to Fortran 90 if suffix is unrecognized.
deduceFortranVersion :: FilePath -> FortranVersion
deduceFortranVersion path
  | isExtensionOf ".f"      = Fortran77Extended
  | isExtensionOf ".for"    = Fortran77
  | isExtensionOf ".fpp"    = Fortran77
  | isExtensionOf ".ftn"    = Fortran77
  | isExtensionOf ".f90"    = Fortran90
  | isExtensionOf ".f95"    = Fortran95
  | isExtensionOf ".f03"    = Fortran2003
  | isExtensionOf ".f2003"  = Fortran2003
  | isExtensionOf ".f08"    = Fortran2008
  | isExtensionOf ".f2008"  = Fortran2008
  | otherwise               = Fortran90         -- unrecognized, default to F90
  where
    isExtensionOf = flip isSuffixOf $ map toLower path

-- | Alias for previous function name. TODO: deprecate eventually.
deduceVersion :: FilePath -> FortranVersion
deduceVersion = deduceFortranVersion