{-# LANGUAGE FlexibleInstances #-}

module HaskellWorks.Data.BalancedParens.Enclose
  ( Enclose(..)
  ) where

import Data.Word
import HaskellWorks.Data.BalancedParens.FindOpenN
import HaskellWorks.Data.Bits.BitShown
import HaskellWorks.Data.Naive
import HaskellWorks.Data.Positioning

import qualified Data.Vector.Storable as DVS

class Enclose v where
  enclose :: v -> Count -> Maybe Count

instance (Enclose a) => Enclose (BitShown a) where
  enclose :: BitShown a -> Count -> Maybe Count
enclose = forall v. Enclose v => v -> Count -> Maybe Count
enclose forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. BitShown a -> a
bitShown
  {-# INLINE enclose #-}

instance Enclose [Bool] where
  enclose :: [Bool] -> Count -> Maybe Count
enclose [Bool]
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN [Bool]
v Count
1
  {-# INLINE enclose #-}

instance Enclose (DVS.Vector Word8) where
  enclose :: Vector Word8 -> Count -> Maybe Count
enclose Vector Word8
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Vector Word8
v Count
1
  {-# INLINE enclose #-}

instance Enclose (DVS.Vector Word16) where
  enclose :: Vector Word16 -> Count -> Maybe Count
enclose Vector Word16
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Vector Word16
v Count
1
  {-# INLINE enclose #-}

instance Enclose (DVS.Vector Word32) where
  enclose :: Vector Word32 -> Count -> Maybe Count
enclose Vector Word32
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Vector Word32
v Count
1
  {-# INLINE enclose #-}

instance Enclose (DVS.Vector Word64) where
  enclose :: Vector Count -> Count -> Maybe Count
enclose Vector Count
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Vector Count
v Count
1
  {-# INLINE enclose #-}

instance Enclose Word8 where
  enclose :: Word8 -> Count -> Maybe Count
enclose Word8
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Word8
v Count
1
  {-# INLINE enclose #-}

instance Enclose Word16 where
  enclose :: Word16 -> Count -> Maybe Count
enclose Word16
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Word16
v Count
1
  {-# INLINE enclose #-}

instance Enclose Word32 where
  enclose :: Word32 -> Count -> Maybe Count
enclose Word32
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Word32
v Count
1
  {-# INLINE enclose #-}

instance Enclose Word64 where
  enclose :: Count -> Count -> Maybe Count
enclose Count
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Count
v Count
1
  {-# INLINE enclose #-}

instance Enclose (Naive Word64) where
  enclose :: Naive Count -> Count -> Maybe Count
enclose Naive Count
v = forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Naive Count
v Count
1
  {-# INLINE enclose #-}