    {-# LANGUAGE ScopedTypeVariables #-}

    module Happy.Tabular.NameSet (
        -- * Set type
        NameSet (..),
        -- * Construction
        empty,
        singleton,
        fromList,
        -- * Deletion
        delete,
        -- * Query
        member,
        null,
        -- * Combine
        union,
        unions,
        difference,
        (\\),
        -- * Folds
        foldr,
        -- * Conversion
        -- ** List
        toAscList
      ) where

    import           Prelude hiding (foldr, null)

    import           Data.Coerce
    import           Data.IntSet (IntSet)
    import qualified Data.IntSet as IntSet

    import           Happy.Grammar

    newtype NameSet = MkNameSet IntSet
      deriving (ReadPrec [NameSet]
    ReadPrec NameSet
    Key -> ReadS NameSet
    ReadS [NameSet]
    (Key -> ReadS NameSet)
    -> ReadS [NameSet]
    -> ReadPrec NameSet
    -> ReadPrec [NameSet]
    -> Read NameSet
    forall a.
    (Key -> ReadS a)
    -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
    $creadsPrec :: Key -> ReadS NameSet
    readsPrec :: Key -> ReadS NameSet
    $creadList :: ReadS [NameSet]
    readList :: ReadS [NameSet]
    $creadPrec :: ReadPrec NameSet
    readPrec :: ReadPrec NameSet
    $creadListPrec :: ReadPrec [NameSet]
    readListPrec :: ReadPrec [NameSet]
    Read, Key -> NameSet -> ShowS
    [NameSet] -> ShowS
    NameSet -> String
    (Key -> NameSet -> ShowS)
    -> (NameSet -> String) -> ([NameSet] -> ShowS) -> Show NameSet
    forall a.
    (Key -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
    $cshowsPrec :: Key -> NameSet -> ShowS
    showsPrec :: Key -> NameSet -> ShowS
    $cshow :: NameSet -> String
    show :: NameSet -> String
    $cshowList :: [NameSet] -> ShowS
    showList :: [NameSet] -> ShowS
    Show, NameSet -> NameSet -> Bool
    (NameSet -> NameSet -> Bool)
    -> (NameSet -> NameSet -> Bool) -> Eq NameSet
    forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
    $c== :: NameSet -> NameSet -> Bool
    == :: NameSet -> NameSet -> Bool
    $c/= :: NameSet -> NameSet -> Bool
    /= :: NameSet -> NameSet -> Bool
    Eq, Eq NameSet
    Eq NameSet =>
    (NameSet -> NameSet -> Ordering)
    -> (NameSet -> NameSet -> Bool)
    -> (NameSet -> NameSet -> Bool)
    -> (NameSet -> NameSet -> Bool)
    -> (NameSet -> NameSet -> Bool)
    -> (NameSet -> NameSet -> NameSet)
    -> (NameSet -> NameSet -> NameSet)
    -> Ord NameSet
    NameSet -> NameSet -> Bool
    NameSet -> NameSet -> Ordering
    NameSet -> NameSet -> NameSet
    forall a.
    Eq a =>
    (a -> a -> Ordering)
    -> (a -> a -> Bool)
    -> (a -> a -> Bool)
    -> (a -> a -> Bool)
    -> (a -> a -> Bool)
    -> (a -> a -> a)
    -> (a -> a -> a)
    -> Ord a
    $ccompare :: NameSet -> NameSet -> Ordering
    compare :: NameSet -> NameSet -> Ordering
    $c< :: NameSet -> NameSet -> Bool
    < :: NameSet -> NameSet -> Bool
    $c<= :: NameSet -> NameSet -> Bool
    <= :: NameSet -> NameSet -> Bool
    $c> :: NameSet -> NameSet -> Bool
    > :: NameSet -> NameSet -> Bool
    $c>= :: NameSet -> NameSet -> Bool
    >= :: NameSet -> NameSet -> Bool
    $cmax :: NameSet -> NameSet -> NameSet
    max :: NameSet -> NameSet -> NameSet
    $cmin :: NameSet -> NameSet -> NameSet
    min :: NameSet -> NameSet -> NameSet
    Ord)

    --

    empty :: NameSet
    empty :: NameSet
    empty = IntSet -> NameSet
    forall a b. Coercible a b => a -> b
    coerce IntSet
    IntSet.empty

    singleton :: Name -> NameSet
    singleton :: Name -> NameSet
    singleton = (Key -> IntSet) -> Name -> NameSet
    forall a b. Coercible a b => a -> b
    coerce Key -> IntSet
    IntSet.singleton

    fromList :: [Name] -> NameSet
    fromList :: [Name] -> NameSet
    fromList = ([Key] -> IntSet) -> [Name] -> NameSet
    forall a b. Coercible a b => a -> b
    coerce [Key] -> IntSet
    IntSet.fromList

    --

    delete :: Name -> NameSet -> NameSet
    delete :: Name -> NameSet -> NameSet
    delete = (Key -> IntSet -> IntSet) -> Name -> NameSet -> NameSet
    forall a b. Coercible a b => a -> b
    coerce Key -> IntSet -> IntSet
    IntSet.delete

    --

    member :: Name -> NameSet -> Bool
    member :: Name -> NameSet -> Bool
    member = (Key -> IntSet -> Bool) -> Name -> NameSet -> Bool
    forall a b. Coercible a b => a -> b
    coerce Key -> IntSet -> Bool
    IntSet.member

    null :: NameSet -> Bool
    null :: NameSet -> Bool
    null = (IntSet -> Bool) -> NameSet -> Bool
    forall a b. Coercible a b => a -> b
    coerce IntSet -> Bool
    IntSet.null

    --

    union :: NameSet -> NameSet -> NameSet
    union :: NameSet -> NameSet -> NameSet
    union = (IntSet -> IntSet -> IntSet) -> NameSet -> NameSet -> NameSet
    forall a b. Coercible a b => a -> b
    coerce IntSet -> IntSet -> IntSet
    IntSet.union

    unions :: [NameSet] -> NameSet
    unions :: [NameSet] -> NameSet
    unions = IntSet -> NameSet
    forall a b. Coercible a b => a -> b
    coerce (IntSet -> NameSet)
    -> ([NameSet] -> IntSet) -> [NameSet] -> NameSet
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . [IntSet] -> IntSet
    forall (f :: * -> *). Foldable f => f IntSet -> IntSet
    IntSet.unions ([IntSet] -> IntSet)
    -> ([NameSet] -> [IntSet]) -> [NameSet] -> IntSet
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . (NameSet -> IntSet) -> [NameSet] -> [IntSet]
    forall a b. (a -> b) -> [a] -> [b]
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap NameSet -> IntSet
    forall a b. Coercible a b => a -> b
    coerce

    difference :: NameSet -> NameSet -> NameSet
    difference :: NameSet -> NameSet -> NameSet
    difference = (IntSet -> IntSet -> IntSet) -> NameSet -> NameSet -> NameSet
    forall a b. Coercible a b => a -> b
    coerce IntSet -> IntSet -> IntSet
    IntSet.difference

    (\\) :: NameSet -> NameSet -> NameSet
    \\ :: NameSet -> NameSet -> NameSet
    (\\) = (IntSet -> IntSet -> IntSet) -> NameSet -> NameSet -> NameSet
    forall a b. Coercible a b => a -> b
    coerce IntSet -> IntSet -> IntSet
    (IntSet.\\)

    --

    foldr :: forall b. (Name -> b -> b) -> b -> NameSet -> b
    foldr :: forall b. (Name -> b -> b) -> b -> NameSet -> b
    foldr = ((Key -> b -> b) -> b -> IntSet -> b)
    -> (Name -> b -> b) -> b -> NameSet -> b
    forall a b. Coercible a b => a -> b
    coerce ((Key -> b -> b) -> b -> IntSet -> b
    forall b. (Key -> b -> b) -> b -> IntSet -> b
    IntSet.foldr :: (Int -> b -> b) -> b -> IntSet -> b)

    --

    toAscList :: NameSet -> [Name]
    toAscList :: NameSet -> [Name]
    toAscList = (IntSet -> [Key]) -> NameSet -> [Name]
    forall a b. Coercible a b => a -> b
    coerce IntSet -> [Key]
    IntSet.toAscList