{-# language TypeFamilies #-}
module Nix.Type.Env
( Env(..)
, empty
, lookup
, remove
, extend
, extends
, merge
, mergeEnvs
, singleton
, keys
, fromList
, toList
)
where
import Nix.Prelude hiding ( empty
, toList
, fromList
)
import Nix.Expr.Types
import Nix.Type.Type
import qualified Data.Map as Map
newtype Env = TypeEnv (Map VarName [Scheme])
deriving (Env -> Env -> Bool
(Env -> Env -> Bool) -> (Env -> Env -> Bool) -> Eq Env
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Env -> Env -> Bool
$c/= :: Env -> Env -> Bool
== :: Env -> Env -> Bool
$c== :: Env -> Env -> Bool
Eq, Int -> Env -> ShowS
[Env] -> ShowS
Env -> String
(Int -> Env -> ShowS)
-> (Env -> String) -> ([Env] -> ShowS) -> Show Env
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Env] -> ShowS
$cshowList :: [Env] -> ShowS
show :: Env -> String
$cshow :: Env -> String
showsPrec :: Int -> Env -> ShowS
$cshowsPrec :: Int -> Env -> ShowS
Show)
instance Semigroup Env where
<> :: Env -> Env -> Env
(<>) = Env -> Env -> Env
mergeRight
instance Monoid Env where
mempty :: Env
mempty = Env
empty
instance One Env where
type OneItem Env = (VarName, Scheme)
one :: OneItem Env -> Env
one (x, y) = Map VarName [Scheme] -> Env
TypeEnv (Map VarName [Scheme] -> Env) -> Map VarName [Scheme] -> Env
forall a b. (a -> b) -> a -> b
$ OneItem (Map VarName [Scheme]) -> Map VarName [Scheme]
forall x. One x => OneItem x -> x
one (VarName
x, OneItem [Scheme] -> [Scheme]
forall x. One x => OneItem x -> x
one OneItem [Scheme]
Scheme
y)
empty :: Env
empty :: Env
empty = Map VarName [Scheme] -> Env
TypeEnv Map VarName [Scheme]
forall a. Monoid a => a
mempty
extend :: Env -> (VarName, [Scheme]) -> Env
extend :: Env -> (VarName, [Scheme]) -> Env
extend Env
env (VarName
x, [Scheme]
s) = (Map VarName [Scheme] -> Map VarName [Scheme]) -> Env -> Env
coerce (VarName -> [Scheme] -> Map VarName [Scheme] -> Map VarName [Scheme]
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert VarName
x [Scheme]
s) Env
env
remove :: Env -> VarName -> Env
remove :: Env -> VarName -> Env
remove Env
env VarName
var = Map VarName [Scheme] -> Env
TypeEnv (Map VarName [Scheme] -> Env) -> Map VarName [Scheme] -> Env
forall a b. (a -> b) -> a -> b
$ VarName -> Map VarName [Scheme] -> Map VarName [Scheme]
forall k a. Ord k => k -> Map k a -> Map k a
Map.delete VarName
var (Map VarName [Scheme] -> Map VarName [Scheme])
-> Map VarName [Scheme] -> Map VarName [Scheme]
forall a b. (a -> b) -> a -> b
$ Env -> Map VarName [Scheme]
coerce Env
env
extends :: Env -> [(VarName, [Scheme])] -> Env
extends :: Env -> [(VarName, [Scheme])] -> Env
extends Env
env [(VarName, [Scheme])]
xs = [(VarName, [Scheme])] -> Env
fromList [(VarName, [Scheme])]
xs Env -> Env -> Env
forall a. Semigroup a => a -> a -> a
<> Env -> Env
coerce Env
env
lookup :: VarName -> Env -> Maybe [Scheme]
lookup :: VarName -> Env -> Maybe [Scheme]
lookup VarName
key Env
tys = VarName -> Map VarName [Scheme] -> Maybe [Scheme]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup VarName
key (Map VarName [Scheme] -> Maybe [Scheme])
-> Map VarName [Scheme] -> Maybe [Scheme]
forall a b. (a -> b) -> a -> b
$ Env -> Map VarName [Scheme]
coerce Env
tys
merge :: Env -> Env -> Env
merge :: Env -> Env -> Env
merge Env
a Env
b = Map VarName [Scheme] -> Env
TypeEnv (Map VarName [Scheme] -> Env) -> Map VarName [Scheme] -> Env
forall a b. (a -> b) -> a -> b
$ Env -> Map VarName [Scheme]
coerce Env
a Map VarName [Scheme]
-> Map VarName [Scheme] -> Map VarName [Scheme]
forall a. Semigroup a => a -> a -> a
<> Env -> Map VarName [Scheme]
coerce Env
b
mergeRight :: Env -> Env -> Env
mergeRight :: Env -> Env -> Env
mergeRight = (Env -> Env -> Env) -> Env -> Env -> Env
forall a b c. (a -> b -> c) -> b -> a -> c
flip Env -> Env -> Env
merge
mergeEnvs :: [Env] -> Env
mergeEnvs :: [Env] -> Env
mergeEnvs = (Env -> Env -> Env) -> Env -> [Env] -> Env
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' Env -> Env -> Env
forall a. Semigroup a => a -> a -> a
(<>) Env
forall a. Monoid a => a
mempty
singleton :: VarName -> Scheme -> Env
singleton :: VarName -> Scheme -> Env
singleton = ((VarName, Scheme) -> Env) -> VarName -> Scheme -> Env
forall a b c. ((a, b) -> c) -> a -> b -> c
curry (VarName, Scheme) -> Env
forall x. One x => OneItem x -> x
one
keys :: Env -> [VarName]
keys :: Env -> [VarName]
keys (TypeEnv Map VarName [Scheme]
env) = Map VarName [Scheme] -> [VarName]
forall k a. Map k a -> [k]
Map.keys Map VarName [Scheme]
env
fromList :: [(VarName, [Scheme])] -> Env
fromList :: [(VarName, [Scheme])] -> Env
fromList [(VarName, [Scheme])]
xs = Map VarName [Scheme] -> Env
coerce (Map VarName [Scheme] -> Env) -> Map VarName [Scheme] -> Env
forall a b. (a -> b) -> a -> b
$ [(VarName, [Scheme])] -> Map VarName [Scheme]
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(VarName, [Scheme])]
xs
toList :: Env -> [(VarName, [Scheme])]
toList :: Env -> [(VarName, [Scheme])]
toList (TypeEnv Map VarName [Scheme]
env) = Map VarName [Scheme] -> [(VarName, [Scheme])]
forall k a. Map k a -> [(k, a)]
Map.toList Map VarName [Scheme]
env