packages feed

telescope-0.3.0: src/Telescope/Data/WCS.hs

{-# LANGUAGE AllowAmbiguousTypes #-}

module Telescope.Data.WCS where

import Data.Text (Text, pack)
import GHC.Generics (Generic)
import Telescope.Data.Axes (AxisOrder (..))
import Telescope.Data.KnownText


newtype CUnit = CUnit Text deriving (Eq, Show)
newtype CType = CType Text deriving (Eq, Show)


{- | Typed WCS Axes

> data X
> data Y
>
> myFunction :: WCSAxis 'WCSMain X -> WCSAxis 'WCSMain Y -> Header
> myFunction wcsx wcsy =
>   toHeader wcsx <> toHeader wcsy
-}
data WCSAxis (alt :: WCSAlt) axis = WCSAxis
  { ctype :: CType
  , cunit :: CUnit
  , crpix :: Float
  , crval :: Float
  , cdelt :: Float
  }
  deriving (Generic, Eq, Show)


-- | WCSAlt options
data WCSAlt
  = WCSMain
  | A
  | B


instance KnownText WCSMain where
  knownText = ""
instance KnownText A where
  knownText = "A"
instance KnownText B where
  knownText = "B"


-- | Converts a wcs keyword like "ctype" to "CTYPE1A" for header parsing
toWCSAxisKey :: forall alt ax. (KnownText alt, AxisOrder ax) => Text -> Text
toWCSAxisKey = addAlt . addAxisN
 where
  addAxisN k = k <> pack (show (axisN @ax))
  addAlt k = k <> (knownText @alt)