{-# language TypeFamilies #-}
module Nix.Type.Assumption
( Assumption(..)
, empty
, lookup
, remove
, extend
, keys
, merge
, singleton
)
where
import Nix.Prelude hiding ( Type
, empty
)
import Nix.Expr.Types
import Nix.Type.Type
newtype Assumption = Assumption [(VarName, Type)]
deriving (Assumption -> Assumption -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Assumption -> Assumption -> Bool
$c/= :: Assumption -> Assumption -> Bool
== :: Assumption -> Assumption -> Bool
$c== :: Assumption -> Assumption -> Bool
Eq, Int -> Assumption -> ShowS
[Assumption] -> ShowS
Assumption -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Assumption] -> ShowS
$cshowList :: [Assumption] -> ShowS
show :: Assumption -> String
$cshow :: Assumption -> String
showsPrec :: Int -> Assumption -> ShowS
$cshowsPrec :: Int -> Assumption -> ShowS
Show)
instance Semigroup Assumption where
<> :: Assumption -> Assumption -> Assumption
(<>) = Assumption -> Assumption -> Assumption
merge
instance Monoid Assumption where
mempty :: Assumption
mempty = Assumption
empty
instance One Assumption where
type OneItem Assumption = (VarName, Type)
one :: OneItem Assumption -> Assumption
one OneItem Assumption
vt = [(VarName, Type)] -> Assumption
Assumption forall a b. (a -> b) -> a -> b
$ forall x. One x => OneItem x -> x
one OneItem Assumption
vt
empty :: Assumption
empty :: Assumption
empty = [(VarName, Type)] -> Assumption
Assumption forall a. Monoid a => a
mempty
extend :: Assumption -> (VarName, Type) -> Assumption
extend :: Assumption -> (VarName, Type) -> Assumption
extend Assumption
a (VarName, Type)
vt =
forall x. One x => OneItem x -> x
one (coerce :: forall a b. Coercible a b => a -> b
coerce (VarName, Type)
vt) forall a. Semigroup a => a -> a -> a
<> Assumption
a
remove :: Assumption -> VarName -> Assumption
remove :: Assumption -> VarName -> Assumption
remove Assumption
a VarName
var =
coerce :: forall a b. Coercible a b => a -> b
coerce
[(VarName, Type)] -> [(VarName, Type)]
rmVar
Assumption
a
where
rmVar :: [(VarName, Type)] -> [(VarName, Type)]
rmVar :: [(VarName, Type)] -> [(VarName, Type)]
rmVar =
forall a. (a -> Bool) -> [a] -> [a]
filter
(forall a. Eq a => a -> a -> Bool
(/=) VarName
var forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst)
lookup :: VarName -> Assumption -> [Type]
lookup :: VarName -> Assumption -> [Type]
lookup VarName
key Assumption
a =
forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
forall a. (a -> Bool) -> [a] -> [a]
filter
(forall a. Eq a => a -> a -> Bool
(==) VarName
key forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst)
(coerce :: forall a b. Coercible a b => a -> b
coerce Assumption
a)
merge :: Assumption -> Assumption -> Assumption
merge :: Assumption -> Assumption -> Assumption
merge =
coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Semigroup a => a -> a -> a
(<>) @[(VarName, Type)])
singleton :: VarName -> Type -> Assumption
singleton :: VarName -> Type -> Assumption
singleton = forall a b c. ((a, b) -> c) -> a -> b -> c
curry forall x. One x => OneItem x -> x
one
keys :: Assumption -> [VarName]
keys :: Assumption -> [VarName]
keys (Assumption [(VarName, Type)]
a) = forall a b. (a, b) -> a
fst forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(VarName, Type)]
a