module Biobase.Types.ReadingFrame where

import GHC.Generics

import Biobase.Types.Index (Index, toInt0)



-- | The Reading frame. Sequence indexing starts at position 1, which starts
-- reading frame 1. Reading frame 2 and 3 start at position 2 and 3
-- respectively.
--
-- The reading frame should be constructed from an @Index 1@ with a smart
-- constructor to get the frame calculation right.

newtype ReadingFrame = ReadingFrame { getReadingFrame  Int }
  deriving (Eq,Ord,Generic)

nextReadingFrame  ReadingFrame  ReadingFrame
{-# Inline nextReadingFrame #-}
nextReadingFrame (ReadingFrame rf) = ReadingFrame $ rf `mod` 3 + 1

prevReadingFrame  ReadingFrame  ReadingFrame
{-# Inline prevReadingFrame #-}
prevReadingFrame (ReadingFrame rf) = ReadingFrame $ rf `mod` 3 + 2

-- |
--
-- TODO should this be a type class, since we might reasonably want to
-- construct from a number of possible indices?

fromIndex  Index 1  ReadingFrame
{-# Inline fromIndex #-}
fromIndex i = ReadingFrame $ (toInt0 i `mod` 3) + 1