{-# 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 = a -> Count -> Maybe Count
forall v. Enclose v => v -> Count -> Maybe Count
enclose (a -> Count -> Maybe Count)
-> (BitShown a -> a) -> BitShown a -> Count -> Maybe Count
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BitShown a -> a
forall a. BitShown a -> a
bitShown
  {-# INLINE enclose #-}

instance Enclose [Bool] where
  enclose :: [Bool] -> Count -> Maybe Count
enclose [Bool]
v = [Bool] -> Count -> Count -> Maybe Count
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 = Vector Word8 -> Count -> Count -> Maybe Count
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 = Vector Word16 -> Count -> Count -> Maybe Count
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 = Vector Word32 -> Count -> Count -> Maybe Count
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 = Vector Count -> Count -> Count -> Maybe Count
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 = Word8 -> Count -> Count -> Maybe Count
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 = Word16 -> Count -> Count -> Maybe Count
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 = Word32 -> Count -> Count -> Maybe Count
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 = Count -> Count -> Count -> Maybe Count
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 = Naive Count -> Count -> Count -> Maybe Count
forall v. FindOpenN v => v -> Count -> Count -> Maybe Count
findOpenN Naive Count
v Count
1
  {-# INLINE enclose #-}