telescope-0.2.0: src/Telescope/Data/Axes.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
module Telescope.Data.Axes where
import GHC.IsList (IsList (..))
import GHC.TypeLits
type Axis = Int
newtype Axes (a :: Major) = Axes {axes :: [Axis]}
deriving (Show, Eq)
data Major = Row | Column
axesRowMajor :: [Axis] -> Axes Row
axesRowMajor = Axes
axesColumnMajor :: [Axis] -> Axes Column
axesColumnMajor = Axes
toRowMajor :: Axes Column -> Axes Row
toRowMajor (Axes as) = Axes (reverse as)
toColumnMajor :: Axes Row -> Axes Column
toColumnMajor (Axes as) = Axes (reverse as)
totalItems :: Axes a -> Int
totalItems (Axes as) = product as
instance IsList (Axes Row) where
type Item (Axes Row) = Axis
fromList = Axes
toList (Axes ax) = ax
{- | Specify which numbered axis a type represents
> data X
> instance AxisOrder X where
> axisN = 1
>
> data Y
> instance AxisOrder Y where
> axisN = 2
-}
class AxisOrder ax where
axisN :: Natural