feat[FlagMask]: default signature with generic ofMask

This commit is contained in:
vegowotenks 2025-08-20 17:27:24 +02:00
parent 603e9b1d53
commit 4e2d2e9b98

View file

@ -6,10 +6,11 @@
{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeFamilies #-}
module Language.Java.Classfile.Flags (Flags(..), FlagMask(..)) where {-# LANGUAGE DefaultSignatures #-}
module Language.Java.Classfile.Flags (Flags(..), FlagMask(..), containsFlag) where
import Data.Bits (Bits((.&.))) import Data.Bits (Bits((.&.), zeroBits))
import Data.Enum.Util (enumerate) import Data.Enum.Util (enumerate)
import Data.Set (Set) import Data.Set (Set)
@ -18,6 +19,8 @@ import qualified Data.Set as Set
import Language.Java.Classfile.Extract (Extract) import Language.Java.Classfile.Extract (Extract)
import Language.Java.Classfile.Extractable (Extractable (extract)) import Language.Java.Classfile.Extractable (Extractable (extract))
import Data.Kind (Type) import Data.Kind (Type)
import Control.Arrow ((>>>))
import qualified Data.List as List
-- | Using the 'FlagMask' instance of the type parameter, this will extract all the flags whose mask produced a non-zero value using '.&.' -- | Using the 'FlagMask' instance of the type parameter, this will extract all the flags whose mask produced a non-zero value using '.&.'
@ -39,3 +42,13 @@ class FlagMask a where
type FlagType a :: Type type FlagType a :: Type
maskOf :: a -> FlagType a maskOf :: a -> FlagType a
ofMask :: FlagType a -> Set a
default ofMask :: (Enum a, Bounded a, Ord a, Bits (FlagType a)) => FlagType a -> Set a
ofMask mask = List.filter (containsFlag mask)
>>> Set.fromList
$ enumerate @a
containsFlag :: (Bits (FlagType a), FlagMask a) => FlagType a -> a -> Bool
containsFlag mask flag = mask .&. maskOf flag /= zeroBits