{-# LANGUAGE FlexibleInstances #-}

module HaskellWorks.Data.BalancedParens.NewCloseAt
  ( NewCloseAt(..)
  , newCloseAt'
  ) where

import Data.Word
import HaskellWorks.Data.Bits.BitLength
import HaskellWorks.Data.Bits.BitShown
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Positioning

import qualified Data.Vector.Storable as DVS

class NewCloseAt v where
  newCloseAt     :: v -> Count -> Bool

newCloseAt' :: TestBit a => a -> Count -> Bool
newCloseAt' v c = not (v .?. toPosition c)
{-# INLINE newCloseAt' #-}

instance (BitLength a, TestBit a) => NewCloseAt (BitShown a) where
  newCloseAt = newCloseAt' . bitShown
  {-# INLINE newCloseAt #-}

instance NewCloseAt [Bool] where
  newCloseAt = newCloseAt'
  {-# INLINE newCloseAt #-}

instance NewCloseAt (DVS.Vector Word8) where
  newCloseAt = newCloseAt'
  {-# INLINE newCloseAt #-}

instance NewCloseAt (DVS.Vector Word16) where
  newCloseAt = newCloseAt'
  {-# INLINE newCloseAt #-}

instance NewCloseAt (DVS.Vector Word32) where
  newCloseAt = newCloseAt'
  {-# INLINE newCloseAt #-}

instance NewCloseAt (DVS.Vector Word64) where
  newCloseAt = newCloseAt'
  {-# INLINE newCloseAt #-}

instance NewCloseAt Word8 where
  newCloseAt = newCloseAt'
  {-# INLINE newCloseAt #-}

instance NewCloseAt Word16 where
  newCloseAt = newCloseAt'
  {-# INLINE newCloseAt #-}

instance NewCloseAt Word32 where
  newCloseAt = newCloseAt'
  {-# INLINE newCloseAt #-}

instance NewCloseAt Word64 where
  newCloseAt = newCloseAt'
  {-# INLINE newCloseAt #-}