-- Copyright (c) Facebook, Inc. and its affiliates. -- -- This source code is licensed under the MIT license found in the -- LICENSE file in the root directory of this source tree. -- {-# LANGUAGE TypeFamilies #-} module Retrie.Quantifiers ( Quantifiers , emptyQs , exceptQ , isQ , mkQs , mkFSQs , qList , qSet , unionQ ) where import GHC.Exts (IsList(..)) import Retrie.GHC ------------------------------------------------------------------------ -- Note [Why not RdrNames?] -- RdrNames carry their namespace in their OccName. The unification of holes -- already handles the namespace more finely, so the extra distinction inside the -- RdrName is just a pain when manipulating the substitution, checking for -- equality, etc. -- Thus, Quantifiers are keyed on FastString (an OccName is a namespace plus -- FastString, so this is just the OccName without its namespace). instance IsList Quantifiers where type Item Quantifiers = String fromList = mkFSQs . map mkFastString toList = map unpackFS . qList -- | 'Quantifiers' is a set of variable names. If you enable the -- "OverloadedLists" language extension, you can construct using a literal -- list of strings. newtype Quantifiers = Quantifiers { qSet :: UniqSet FastString -- ^ Convert to a 'UniqSet'. } -- | Construct from GHC's 'RdrName's. mkQs :: [RdrName] -> Quantifiers mkQs = mkFSQs . map rdrFS -- | Construct from 'FastString's. mkFSQs :: [FastString] -> Quantifiers mkFSQs = Quantifiers . mkUniqSet -- | The empty set. emptyQs :: Quantifiers emptyQs = Quantifiers emptyUniqSet -- | Existence check. isQ :: RdrName -> Quantifiers -> Bool isQ r (Quantifiers s) = elementOfUniqSet (rdrFS r) s -- | Set union. unionQ :: Quantifiers -> Quantifiers -> Quantifiers unionQ (Quantifiers s) (Quantifiers t) = Quantifiers $ unionUniqSets s t -- | Remove a set of 'RdrName's from the set. exceptQ :: Quantifiers -> [RdrName] -> Quantifiers exceptQ (Quantifiers s) rs = Quantifiers $ delListFromUniqSet s (map rdrFS rs) -- | Convert to a list. qList :: Quantifiers -> [FastString] qList (Quantifiers s) = nonDetEltsUniqSet s