-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | SPDX license expression language, Extras
--   
--   Cabal provides SPDX types. This package provides some extras.
@package spdx
@version 1.0.0.3


-- | Inspired by <a>Simple SMT Solver</a>.
--   
--   In future this module will probably be moved into separate package.
module Distribution.SPDX.Extra.Internal
data LatticeSyntax a
LVar :: a -> LatticeSyntax a
LBound :: Bool -> LatticeSyntax a
LJoin :: LatticeSyntax a -> LatticeSyntax a -> LatticeSyntax a
LMeet :: LatticeSyntax a -> LatticeSyntax a -> LatticeSyntax a
dual :: LatticeSyntax a -> LatticeSyntax a
freeVars :: LatticeSyntax a -> [a]

-- | Test for equivalence.
--   
--   <pre>
--   &gt;&gt;&gt; equivalent (LMeet (LVar 'a') (LVar 'b')) (LMeet (LVar 'b') (LVar 'a'))
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; equivalent (LVar 'a') (LMeet (LVar 'a') (LVar 'a'))
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; equivalent (LMeet (LVar 'a') (LVar 'b')) (LMeet (LVar 'b') (LVar 'b'))
--   False
--   </pre>
equivalent :: Ord a => LatticeSyntax a -> LatticeSyntax a -> Bool

-- | Test for preorder.
--   
--   <pre>
--   a ≤ b ⇔ a ∨ b ≡ b ⇔ a ≡ a ∧ b
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; preorder (LVar 'a' `LMeet` LVar 'b') (LVar 'a')
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; preorder (LVar 'a') (LVar 'a' `LMeet` LVar 'b')
--   False
--   </pre>
preorder :: Ord a => LatticeSyntax a -> LatticeSyntax a -> Bool

-- | Return <a>True</a> if for some variable assigment expression evaluates
--   to <a>True</a>.
satisfiable :: Ord a => LatticeSyntax a -> Bool
instance GHC.Base.Alternative (Distribution.SPDX.Extra.Internal.Eval v)
instance GHC.Base.Applicative (Distribution.SPDX.Extra.Internal.Eval v)
instance GHC.Base.Applicative Distribution.SPDX.Extra.Internal.LatticeSyntax
instance Data.Data.Data a => Data.Data.Data (Distribution.SPDX.Extra.Internal.LatticeSyntax a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Distribution.SPDX.Extra.Internal.LatticeSyntax a)
instance Data.Foldable.Foldable Distribution.SPDX.Extra.Internal.LatticeSyntax
instance GHC.Base.Functor (Distribution.SPDX.Extra.Internal.Eval v)
instance GHC.Base.Functor Distribution.SPDX.Extra.Internal.LatticeSyntax
instance GHC.Base.Monad (Distribution.SPDX.Extra.Internal.Eval v)
instance GHC.Base.Monad Distribution.SPDX.Extra.Internal.LatticeSyntax
instance GHC.Base.MonadPlus (Distribution.SPDX.Extra.Internal.Eval v)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Distribution.SPDX.Extra.Internal.LatticeSyntax a)
instance GHC.Read.Read a => GHC.Read.Read (Distribution.SPDX.Extra.Internal.LatticeSyntax a)
instance GHC.Show.Show a => GHC.Show.Show (Distribution.SPDX.Extra.Internal.LatticeSyntax a)
instance Data.Traversable.Traversable Distribution.SPDX.Extra.Internal.LatticeSyntax

module Distribution.SPDX.Extra
data License
data LicenseExpression
data SimpleLicenseExpression
data LicenseId
data LicenseExceptionId

-- | <pre>
--   ⟦ satisfies a b ⟧ ≡ a ≥ b ≡ a ∧ b = b
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseExpr "GPL-3.0-only" `satisfies` unsafeParseExpr "ISC AND MIT"
--   False
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseExpr "Zlib" `satisfies` unsafeParseExpr "ISC AND MIT AND Zlib"
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseExpr "(MIT OR GPL-2.0-only)" `satisfies` unsafeParseExpr "(ISC AND MIT)"
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseExpr "(MIT AND GPL-2.0-only)" `satisfies` unsafeParseExpr "(MIT AND GPL-2.0-only)"
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseExpr "(MIT AND GPL-2.0-only)" `satisfies` unsafeParseExpr "(ISC AND GPL-2.0-only)"
--   False
--   </pre>
satisfies :: License -> License -> Bool

-- | Check wheather two <a>LicenseExpression</a> are equivalent.
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseExpr "(MIT AND GPL-2.0-only)" `equivalent` unsafeParseExpr "(GPL-2.0-only AND MIT)"
--   True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; unsafeParseExpr "MIT" `equivalent` unsafeParseExpr "MIT OR BSD-3-Clause"
--   False
--   </pre>
equivalent :: License -> License -> Bool
instance GHC.Classes.Eq Distribution.SPDX.Extra.Lic
instance GHC.Classes.Ord Distribution.SPDX.Extra.Lic
