1010{-# LANGUAGE LambdaCase #-}
1111{-# LANGUAGE FlexibleContexts #-}
1212{-# LANGUAGE FlexibleInstances #-}
13+ {-# LANGUAGE GADTs #-}
1314{-# LANGUAGE MultiWayIf #-}
1415{-# LANGUAGE CPP #-}
1516{-# LANGUAGE OverloadedStrings #-}
1617{-# LANGUAGE ScopedTypeVariables #-}
18+ {-# LANGUAGE StandaloneDeriving #-}
1719{-# LANGUAGE TupleSections #-}
1820{-# LANGUAGE TypeApplications #-}
21+ {-# LANGUAGE UndecidableInstances #-}
1922
2023module Repl
2124 ( main
@@ -29,6 +32,8 @@ import Nix.Scope
2932import Nix.Utils
3033import Nix.Value.Monad (demand )
3134
35+ import Control.Comonad
36+ import Data.Functor.Classes
3237import qualified Data.List
3338import qualified Data.Maybe
3439import qualified Data.HashMap.Lazy
@@ -64,13 +69,13 @@ import qualified System.Exit
6469import qualified System.IO.Error
6570
6671-- | Repl entry point
67- main :: (MonadNix e t f m , MonadIO m , MonadMask m ) => m ()
72+ main :: (MonadNix e f m , MonadIO m , MonadMask m ) => m ()
6873main = main' Nothing
6974
7075-- | Principled version allowing to pass initial value for context.
7176--
7277-- Passed value is stored in context with "input" key.
73- main' :: (MonadNix e t f m , MonadIO m , MonadMask m ) => Maybe (NValue t f m ) -> m ()
78+ main' :: (MonadNix e f m , MonadIO m , MonadMask m ) => Maybe (NValue f m ) -> m ()
7479main' iniVal = initState iniVal >>= \ s -> flip evalStateT s
7580 $ System.Console.Repline. evalRepl
7681 banner
@@ -128,11 +133,14 @@ main' iniVal = initState iniVal >>= \s -> flip evalStateT s
128133-- * Types
129134---------------------------------------------------------------------------------
130135
131- data IState t f m = IState
136+ data IState f m = IState
132137 { replIt :: Maybe NExprLoc -- ^ Last expression entered
133- , replCtx :: AttrSet (NValue t f m ) -- ^ Value environment
138+ , replCtx :: AttrSet (NValue f m ) -- ^ Value environment
134139 , replCfg :: ReplConfig -- ^ REPL configuration
135- } deriving (Eq , Show )
140+ }
141+
142+ deriving instance (Eq1 f , Eq1 m , Eq (Thunk m )) => Eq (IState f m )
143+ deriving instance (Comonad f , Show (Thunk m )) => Show (IState f m )
136144
137145data ReplConfig = ReplConfig
138146 { cfgDebug :: Bool
@@ -148,7 +156,7 @@ defReplConfig = ReplConfig
148156 }
149157
150158-- | Create initial IState for REPL
151- initState :: MonadNix e t f m => Maybe (NValue t f m ) -> m (IState t f m )
159+ initState :: MonadNix e f m => Maybe (NValue f m ) -> m (IState f m )
152160initState mIni = do
153161
154162 builtins <- evalText " builtins"
@@ -164,23 +172,23 @@ initState mIni = do
164172 , cfgValues = values opts
165173 }
166174 where
167- evalText :: (MonadNix e t f m ) => Text -> m (NValue t f m )
175+ evalText :: (MonadNix e f m ) => Text -> m (NValue f m )
168176 evalText expr = case parseNixTextLoc expr of
169177 Failure e -> error $ " Impossible happened: Unable to parse expression - '" ++ Data.Text. unpack expr ++ " ' error was " ++ show e
170178 Success e -> do evalExprLoc e
171179
172- type Repl e t f m = HaskelineT (StateT (IState t f m ) m )
180+ type Repl e f m = HaskelineT (StateT (IState f m ) m )
173181
174182---------------------------------------------------------------------------------
175183-- * Execution
176184---------------------------------------------------------------------------------
177185
178186exec
179- :: forall e t f m
180- . (MonadNix e t f m , MonadIO m )
187+ :: forall e f m
188+ . (MonadNix e f m , MonadIO m )
181189 => Bool
182190 -> Text
183- -> Repl e t f m (Maybe (NValue t f m ))
191+ -> Repl e f m (Maybe (NValue f m ))
184192exec update source = do
185193 -- Get the current interpreter state
186194 st <- get
@@ -206,7 +214,7 @@ exec update source = do
206214
207215 case mVal of
208216 Left (NixException frames) -> do
209- lift $ lift $ liftIO . print =<< renderFrames @ (NValue t f m ) @ t frames
217+ lift $ lift $ liftIO . print =<< renderFrames @ (NValue f m ) frames
210218 pure Nothing
211219 Right val -> do
212220 -- Update the interpreter state
@@ -237,18 +245,18 @@ exec update source = do
237245 toAttrSet i = " {" <> i <> (if Data.Text. isSuffixOf " ;" i then mempty else " ;" ) <> " }"
238246
239247cmd
240- :: (MonadNix e t f m , MonadIO m )
248+ :: (MonadNix e f m , MonadIO m )
241249 => String
242- -> Repl e t f m ()
250+ -> Repl e f m ()
243251cmd source = do
244252 mVal <- exec True (Data.Text. pack source)
245253 case mVal of
246254 Nothing -> pure ()
247255 Just val -> printValue val
248256
249- printValue :: (MonadNix e t f m , MonadIO m )
250- => NValue t f m
251- -> Repl e t f m ()
257+ printValue :: (MonadNix e f m , MonadIO m )
258+ => NValue f m
259+ -> Repl e f m ()
252260printValue val = do
253261 cfg <- replCfg <$> get
254262 lift $ lift $ do
@@ -262,9 +270,9 @@ printValue val = do
262270---------------------------------------------------------------------------------
263271
264272-- :browse command
265- browse :: (MonadNix e t f m , MonadIO m )
273+ browse :: (MonadNix e f m , MonadIO m )
266274 => String
267- -> Repl e t f m ()
275+ -> Repl e f m ()
268276browse _ = do
269277 st <- get
270278 forM_ (Data.HashMap.Lazy. toList $ replCtx st) $ \ (k, v) -> do
@@ -273,9 +281,9 @@ browse _ = do
273281
274282-- :load command
275283load
276- :: (MonadNix e t f m , MonadIO m )
284+ :: (MonadNix e f m , MonadIO m )
277285 => String
278- -> Repl e t f m ()
286+ -> Repl e f m ()
279287load args = do
280288 contents <- liftIO
281289 $ Data.Text.IO. readFile
@@ -286,9 +294,9 @@ load args = do
286294
287295-- :type command
288296typeof
289- :: (MonadNix e t f m , MonadIO m )
297+ :: (MonadNix e f m , MonadIO m )
290298 => String
291- -> Repl e t f m ()
299+ -> Repl e f m ()
292300typeof args = do
293301 st <- get
294302 mVal <- case Data.HashMap.Lazy. lookup line (replCtx st) of
@@ -303,11 +311,11 @@ typeof args = do
303311 where line = Data.Text. pack args
304312
305313-- :quit command
306- quit :: (MonadNix e t f m , MonadIO m ) => a -> Repl e t f m ()
314+ quit :: (MonadNix e f m , MonadIO m ) => a -> Repl e f m ()
307315quit _ = liftIO System.Exit. exitSuccess
308316
309317-- :set command
310- setConfig :: (MonadNix e t f m , MonadIO m ) => String -> Repl e t f m ()
318+ setConfig :: (MonadNix e f m , MonadIO m ) => String -> Repl e f m ()
311319setConfig args = case words args of
312320 [] -> liftIO $ putStrLn " No option to set specified"
313321 (x: _xs) ->
@@ -326,8 +334,8 @@ defaultMatcher =
326334 ]
327335
328336completion
329- :: (MonadNix e t f m , MonadIO m )
330- => CompleterStyle (StateT (IState t f m ) m )
337+ :: (MonadNix e f m , MonadIO m )
338+ => CompleterStyle (StateT (IState f m ) m )
331339completion = System.Console.Repline. Prefix
332340 (completeWordWithPrev (Just ' \\ ' ) separators completeFunc)
333341 defaultMatcher
@@ -340,15 +348,15 @@ completion = System.Console.Repline.Prefix
340348-- Heavily inspired by Dhall Repl, with `algebraicComplete`
341349-- adjusted to monadic variant able to `demand` thunks.
342350completeFunc
343- :: forall e t f m . (MonadNix e t f m , MonadIO m )
351+ :: forall e f m . (MonadNix e f m , MonadIO m )
344352 => String
345353 -> String
346- -> (StateT (IState t f m ) m ) [Completion ]
354+ -> (StateT (IState f m ) m ) [Completion ]
347355completeFunc reversedPrev word
348356 -- Commands
349357 | reversedPrev == " :"
350358 = pure . listCompletion
351- $ map helpOptionName (helpOptions :: HelpOptions e t f m )
359+ $ map helpOptionName (helpOptions :: HelpOptions e f m )
352360
353361 -- Files
354362 | any (`Data.List.isPrefixOf` word) [ " /" , " ./" , " ../" , " ~/" ]
@@ -385,9 +393,9 @@ completeFunc reversedPrev word
385393
386394 notFinished x = x { isFinished = False }
387395
388- algebraicComplete :: (MonadNix e t f m )
396+ algebraicComplete :: (MonadNix e f m )
389397 => [Text ]
390- -> NValue t f m
398+ -> NValue f m
391399 -> m [Text ]
392400 algebraicComplete subFields val =
393401 let keys = fmap (" ." <> ) . Data.HashMap.Lazy. keys
@@ -409,16 +417,16 @@ completeFunc reversedPrev word
409417
410418-- HelpOption inspired by Dhall Repl
411419-- with `Doc` instead of String for syntax and doc
412- data HelpOption e t f m = HelpOption
420+ data HelpOption e f m = HelpOption
413421 { helpOptionName :: String
414422 , helpOptionSyntax :: Doc ()
415423 , helpOptionDoc :: Doc ()
416- , helpOptionFunction :: Cmd (Repl e t f m )
424+ , helpOptionFunction :: Cmd (Repl e f m )
417425 }
418426
419- type HelpOptions e t f m = [HelpOption e t f m ]
427+ type HelpOptions e f m = [HelpOption e f m ]
420428
421- helpOptions :: (MonadNix e t f m , MonadIO m ) => HelpOptions e t f m
429+ helpOptions :: (MonadNix e f m , MonadIO m ) => HelpOptions e f m
422430helpOptions =
423431 [ HelpOption
424432 " help"
@@ -515,10 +523,10 @@ renderSetOptions so =
515523 <> Prettyprinter. line
516524 <> Prettyprinter. indent 4 (helpSetOptionDoc h)
517525
518- help :: (MonadNix e t f m , MonadIO m )
519- => HelpOptions e t f m
526+ help :: (MonadNix e f m , MonadIO m )
527+ => HelpOptions e f m
520528 -> String
521- -> Repl e t f m ()
529+ -> Repl e f m ()
522530help hs _ = do
523531 liftIO $ putStrLn " Available commands:\n "
524532 forM_ hs $ \ h ->
@@ -534,6 +542,6 @@ help hs _ = do
534542 <> Prettyprinter. indent 4 (helpOptionDoc h)
535543
536544options
537- :: (MonadNix e t f m , MonadIO m )
538- => System.Console.Repline. Options (Repl e t f m )
545+ :: (MonadNix e f m , MonadIO m )
546+ => System.Console.Repline. Options (Repl e f m )
539547options = (\ h -> (helpOptionName h, helpOptionFunction h)) <$> helpOptions
0 commit comments