Use a Set in isInherited to speed up long extend lists

Now the time is O(log(n)*m) instead of O(n*m) where n is the number of
items in the extend list

e.g.
abstract FromWordNet = WordNet [
a_couple_Card,
a_la_carte_Adv,
a_la_mode_Adv,
a_little_Card,
...
];
This commit is contained in:
Andreas Källberg
2022-10-02 21:49:56 +02:00
parent 3122590e35
commit fef7b80d8e

View File

@@ -78,6 +78,7 @@ import PGF.Internal (FId, FunId, SeqId, LIndex, Sequence, BindType(..))
import Data.Array.IArray(Array) import Data.Array.IArray(Array)
import Data.Array.Unboxed(UArray) import Data.Array.Unboxed(UArray)
import qualified Data.Map as Map import qualified Data.Map as Map
import qualified Data.Set as Set
import GF.Text.Pretty import GF.Text.Pretty
@@ -125,10 +126,12 @@ extends :: ModuleInfo -> [ModuleName]
extends = map fst . mextend extends = map fst . mextend
isInherited :: MInclude -> Ident -> Bool isInherited :: MInclude -> Ident -> Bool
isInherited c i = case c of isInherited c =
MIAll -> True case c of
MIOnly is -> elem i is MIAll -> const True
MIExcept is -> notElem i is MIOnly is -> let is' = Set.fromList is in (`Set.member` is')
MIExcept is -> let is' = Set.fromList is in (`Set.notMember` is')
inheritAll :: ModuleName -> (ModuleName,MInclude) inheritAll :: ModuleName -> (ModuleName,MInclude)
inheritAll i = (i,MIAll) inheritAll i = (i,MIAll)