-- | A special class of bounds for RNA/pair encodings that are used to index
-- into tables. We typically encode more in the alphabets than we want to use
-- to index, so in order to keep things simple, we have specialized bounds.

module Biobase.Primary.Bounds where



-- | 'minNormal' and 'maxNormal' encode for, say, ACGU; while 'minExtended' and
-- 'maxExtended' would allow 'N' as well. See Biobase.RNA and
-- Biobase.RNA.ViennaPair for instances.

class Bounded a => Bounds a where
  minNormal :: a
  maxNormal :: a
  minExtended :: a
  maxExtended :: a



-- * Instances for tuples of size 2-6

instance (Bounds a, Bounds b) => Bounds (a,b) where
  minNormal = (minNormal, minNormal)
  maxNormal = (maxNormal, maxNormal)
  minExtended = (minExtended, minExtended)
  maxExtended = (maxExtended, maxExtended)

instance (Bounds a, Bounds b, Bounds c) => Bounds (a,b,c) where
  minNormal = (minNormal, minNormal, minNormal)
  maxNormal = (maxNormal, maxNormal, maxNormal)
  minExtended = (minExtended, minExtended, minExtended)
  maxExtended = (maxExtended, maxExtended, maxExtended)

instance (Bounds a, Bounds b, Bounds c, Bounds d) => Bounds (a,b,c,d) where
  minNormal = (minNormal, minNormal, minNormal, minNormal)
  maxNormal = (maxNormal, maxNormal, maxNormal, maxNormal)
  minExtended = (minExtended, minExtended, minExtended, minExtended)
  maxExtended = (maxExtended, maxExtended, maxExtended, maxExtended)

instance (Bounds a, Bounds b, Bounds c, Bounds d, Bounds e) => Bounds (a,b,c,d,e) where
  minNormal = (minNormal, minNormal, minNormal, minNormal, minNormal)
  maxNormal = (maxNormal, maxNormal, maxNormal, maxNormal, maxNormal)
  minExtended = (minExtended, minExtended, minExtended, minExtended, minExtended)
  maxExtended = (maxExtended, maxExtended, maxExtended, maxExtended, maxExtended)

instance (Bounds a, Bounds b, Bounds c, Bounds d, Bounds e, Bounds f) => Bounds (a,b,c,d,e,f) where
  minNormal = (minNormal, minNormal, minNormal, minNormal, minNormal, minNormal)
  maxNormal = (maxNormal, maxNormal, maxNormal, maxNormal, maxNormal, maxNormal)
  minExtended = (minExtended, minExtended, minExtended, minExtended, minExtended, minExtended)
  maxExtended = (maxExtended, maxExtended, maxExtended, maxExtended, maxExtended, maxExtended)