hnetcdf-0.1.0.0: Data/NetCDF/Metadata.hs
{-# LANGUAGE ExistentialQuantification, StandaloneDeriving #-}
-- | NetCDF file metadata handling: when a NetCDF file is opened,
-- metadata defining the dimensions, variables and attributes in the
-- file are read all at once to create a value of type `NcInfo`.
module Data.NetCDF.Metadata
( NcDim (..)
, NcAttr (..)
, NcVar (..)
, NcInfo (..)
, ncDim, ncAttr, ncVar, ncVarAttr
) where
import Data.NetCDF.Types
import qualified Data.Map as M
-- | Information about a dimension: name, number of entries and
-- whether unlimited.
data NcDim = NcDim { ncDimName :: String
, ncDimLength :: Int
, ncDimUnlimited :: Bool
} deriving Show
-- | Attribute value.
data NcAttr = forall a. Show a => NcAttr { ncAttrName :: String
, ncAttrVals :: [a] }
deriving instance Show NcAttr
-- | Information about a variable: name, type, dimensions and
-- attributes.
data NcVar = NcVar { ncVarName :: String
, ncVarType :: NcType
, ncVarDims :: [NcDim]
, ncVarAttrs :: M.Map String NcAttr
} deriving Show
-- | Metadata information for a whole NetCDF file.
data NcInfo = NcInfo { ncName :: FilePath
-- ^ File name.
, ncDims :: M.Map String NcDim
-- ^ Dimensions defined in file.
, ncVars :: M.Map String NcVar
-- ^ Variables defined in file.
, ncAttrs :: M.Map String NcAttr
-- ^ Global attributes defined in file.
, ncId :: NcId
-- ^ Low-level file access ID.
, ncVarIds :: M.Map String NcId
-- ^ Low-level IDs for variables.
} deriving Show
-- | Extract dimension metadata by name.
ncDim :: NcInfo -> String -> Maybe NcDim
ncDim nc n = M.lookup n $ ncDims nc
-- | Extract a global attribute by name.
ncAttr :: NcInfo -> String -> Maybe NcAttr
ncAttr nc n = M.lookup n $ ncAttrs nc
-- | Extract variable metadata by name.
ncVar :: NcInfo -> String -> Maybe NcVar
ncVar nc n = M.lookup n $ ncVars nc
-- | Extract an attribute for a given variable by name.
ncVarAttr :: NcVar -> String -> Maybe NcAttr
ncVarAttr v n = M.lookup n $ ncVarAttrs v