packages feed

telescope-0.3.0: src/Telescope/Fits/Header/Header.hs

module Telescope.Fits.Header.Header where

import Data.List qualified as L
import Data.Maybe (mapMaybe)
import Data.Text (Text)
import Telescope.Fits.Header.Keyword
import Telescope.Fits.Header.Value


{- | The header part of the HDU is vital carrying not only authorship
    metadata, but also specifying how to make sense of the binary payload
    that starts 2,880 bytes after the start of the 'HeaderData'.
-}
newtype Header = Header {records :: [HeaderRecord]}
  deriving newtype (Eq, Semigroup, Monoid)




{- | Headers contain lines that are any of the following

 > KEYWORD = VALUE / inline comment
 > COMMENT full line comment
 > (blank)
-}
data HeaderRecord
  = Keyword KeywordRecord
  | Comment Text
  | History Text
  | BlankLine
  deriving (Show, Eq)


-- | Manually look up a keyword from the header
lookupKeyword :: Text -> Header -> Maybe Value
lookupKeyword k = findKeyword (isKeyword k)


findKeyword :: (KeywordRecord -> Bool) -> Header -> Maybe Value
findKeyword p h = do
  kr <- L.find p (keywords h)
  pure kr.value


-- | Return all 'KeywordRecord's from the header, filtering out full-line comments and blanks
keywords :: Header -> [KeywordRecord]
keywords h = mapMaybe toKeyword h.records
 where
  toKeyword (Keyword k) = Just k
  toKeyword _ = Nothing


-- | Construct a keyword HeaderRecord
keyword :: Text -> Value -> Maybe Text -> HeaderRecord
keyword k v mc = Keyword $ KeywordRecord k v mc