Skip to content

Commit e1e1eff

Browse files
committed
Type.Env: drop singleton accessor, add&use mergeRight for <> (infixr)
As long as type as newtype - singleton accessor is an antipattern. It is stongly seen in this example, black magic with accessors, accessor constructrs & accesor set overrides was reduced.
1 parent 80561d2 commit e1e1eff

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

main/Main.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ import Nix.Json
2828
import Nix.Options.Parser
2929
import Nix.Standard
3030
import Nix.Thunk.Basic
31-
import qualified Nix.Type.Env as Env
31+
import Nix.Type.Env ( Env(..) )
32+
import Nix.Type.Type ( Scheme )
3233
import qualified Nix.Type.Infer as HM
3334
import Nix.Value.Monad
3435
import Options.Applicative hiding ( ParserResult(..) )
@@ -103,7 +104,7 @@ main =
103104
either
104105
(\ err -> errorWithoutStackTrace $ "Type error: " <> PS.ppShow err)
105106
(\ ty -> liftIO $ putStrLn $ "Type of expression: " <> PS.ppShow
106-
(fromJust $ Map.lookup "it" $ Env.types ty)
107+
(fromJust $ Map.lookup "it" (coerce ty :: Map Text [Scheme]))
107108
)
108109
(HM.inferTop mempty [("it", stripAnnotation expr')])
109110

src/Nix/Type/Env.hs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ import qualified Data.Map as Map
2727

2828
-- * Typing Environment
2929

30-
newtype Env = TypeEnv { types :: Map.Map Name [Scheme] }
30+
newtype Env = TypeEnv (Map.Map Name [Scheme])
3131
deriving (Eq, Show)
3232

3333
instance Semigroup Env where
34-
(<>) = merge
34+
-- | Right-biased merge (override). Analogous to @//@ in @Nix@
35+
-- Since nature of environment is to update & grow.
36+
(<>) = mergeRight
3537

3638
instance Monoid Env where
3739
mempty = empty
@@ -44,20 +46,23 @@ empty :: Env
4446
empty = TypeEnv mempty
4547

4648
extend :: Env -> (Name, [Scheme]) -> Env
47-
extend env (x, s) = env { types = Map.insert x s (types env) }
49+
extend env (x, s) = TypeEnv $ Map.insert x s $ coerce env
4850

4951
remove :: Env -> Name -> Env
5052
remove (TypeEnv env) var = TypeEnv $ Map.delete var env
5153

5254
extends :: Env -> [(Name, [Scheme])] -> Env
53-
extends env xs = env { types = Map.fromList xs `Map.union` types env }
55+
extends env xs = TypeEnv $ Map.fromList xs `Map.union` coerce env
5456

5557
lookup :: Name -> Env -> Maybe [Scheme]
5658
lookup key (TypeEnv tys) = Map.lookup key tys
5759

5860
merge :: Env -> Env -> Env
5961
merge (TypeEnv a) (TypeEnv b) = TypeEnv $ a `Map.union` b
6062

63+
mergeRight :: Env -> Env -> Env
64+
mergeRight (TypeEnv a) (TypeEnv b) = TypeEnv $ b `Map.union` a
65+
6166
mergeEnvs :: [Env] -> Env
6267
mergeEnvs = foldl' (<>) mempty
6368

0 commit comments

Comments
 (0)