{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE DerivingStrategies, DeriveAnyClass, GeneralizedNewtypeDeriving #-}

module DSV.Position
  ( RowNumber (..)
  , ColumnNumber (..)
  , ColumnName (..)
  , Position (..)
  , At (..)
  , AtHeader (..)
  ) where

import DSV.IO
import DSV.Numbers
import DSV.Prelude

newtype RowNumber =
  RowNumber Positive
  deriving stock (Eq, Ord)
  deriving newtype (Num, Show)

newtype ColumnNumber =
  ColumnNumber Positive
  deriving stock (Eq, Ord)
  deriving newtype (Num, Show)

newtype ColumnName str =
  ColumnName str
  deriving stock (Eq, Ord, Show)

data Position row col =
  Position row col
  deriving stock (Eq, Ord, Show)

data At p a = At p {- ^ Position -} a
  deriving stock (Eq, Ord, Show)
  deriving anyclass Exception

data AtHeader a = AtHeader a
  deriving stock (Eq, Ord, Show)
  deriving anyclass Exception