packages feed

succinct-0.0.0.1: components/succinct-core/src/Data/Succinct/BalancedParens/BalancedParens.hs

module Data.Succinct.BalancedParens.BalancedParens (
    BalancedParens (..),
    depth,
    subtreeSize,
) where

import Control.Monad
import Data.Succinct.BalancedParens.CloseAt
import Data.Succinct.BalancedParens.Enclose
import Data.Succinct.BalancedParens.FindClose
import Data.Succinct.BalancedParens.FindOpen
import Data.Succinct.BalancedParens.OpenAt
import Data.Succinct.RankSelect.Base.Rank0
import Data.Succinct.RankSelect.Base.Rank1
import Data.Vector.Storable qualified as DVS
import Data.Word
import HaskellWorks.Data.Naive
import HaskellWorks.Data.Positioning

class (OpenAt v, CloseAt v, FindOpen v, FindClose v, Enclose v) => BalancedParens v where
    -- TODO Second argument should be Int
    firstChild :: v -> Count -> Maybe Count
    firstChild v p = if openAt v p && openAt v (p + 1) then Just (p + 1) else Nothing
    {-# INLINE firstChild #-}

    nextSibling :: v -> Count -> Maybe Count
    nextSibling v p =
        if closeAt v p
            then Nothing
            else
                openAt v
                    `mfilter` ( findClose v p
                                    >>= ( \q ->
                                            if p /= q
                                                then return (q + 1)
                                                else Nothing
                                        )
                              )
    {-# INLINE nextSibling #-}

    parent :: v -> Count -> Maybe Count
    parent v p = enclose v p >>= (\r -> if r >= 1 then return r else Nothing)
    {-# INLINE parent #-}

depth :: (BalancedParens v, Rank0 v, Rank1 v) => v -> Count -> Maybe Count
depth v p = (\q -> rank1 v q - rank0 v q) <$> findOpen v p
{-# INLINE depth #-}

subtreeSize :: (BalancedParens v) => v -> Count -> Maybe Count
subtreeSize v p = (\q -> (q - p + 1) `quot` 2) <$> findClose v p
{-# INLINE subtreeSize #-}

instance BalancedParens [Bool]

instance BalancedParens (DVS.Vector Word8)

instance BalancedParens (DVS.Vector Word16)

instance BalancedParens (DVS.Vector Word32)

instance BalancedParens (DVS.Vector Word64)

instance BalancedParens Word8

instance BalancedParens Word16

instance BalancedParens Word32

instance BalancedParens Word64

instance BalancedParens (Naive Word64)