    module Control.Access.RoleBased.Role where

    ------------------------------------------------------------------------------
    import qualified Data.HashMap.Strict as M
    import           Control.Access.RoleBased.Internal.Types
    import           Data.Text (Text)

    ------------------------------------------------------------------------------
    matches :: Role -> Role -> Bool
    matches (Role a1 d1) (Role a2 d2) =
        a1 == a2 && dmatch (toSortedList d1) (toSortedList d2)
      where
        dmatch []         _      = True
        dmatch _          []     = False
        dmatch dds@(d:ds) (e:es) =
            case compare d e of
              LT -> False
              EQ -> dmatch ds es
              GT -> dmatch dds es

    ------------------------------------------------------------------------------
    addRoleData :: Text -> RoleValue -> Role -> Role
    addRoleData k v (Role n d) = Role n $ M.insert k v d