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 (pure ' \\ ' ) 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- $ fmap helpOptionName (helpOptions :: HelpOptions e t f m )
359+ $ fmap helpOptionName (helpOptions :: HelpOptions e f m )
352360
353361 -- Files
354362 | any (`Data.List.isPrefixOf` word) [ " /" , " ./" , " ../" , " ~/" ]
@@ -383,9 +391,9 @@ completeFunc reversedPrev word
383391
384392 notFinished x = x { isFinished = False }
385393
386- algebraicComplete :: (MonadNix e t f m )
394+ algebraicComplete :: (MonadNix e f m )
387395 => [Text ]
388- -> NValue t f m
396+ -> NValue f m
389397 -> m [Text ]
390398 algebraicComplete subFields val =
391399 let keys = fmap (" ." <> ) . Data.HashMap.Lazy. keys
@@ -407,16 +415,16 @@ completeFunc reversedPrev word
407415
408416-- HelpOption inspired by Dhall Repl
409417-- with `Doc` instead of String for syntax and doc
410- data HelpOption e t f m = HelpOption
418+ data HelpOption e f m = HelpOption
411419 { helpOptionName :: String
412420 , helpOptionSyntax :: Doc ()
413421 , helpOptionDoc :: Doc ()
414- , helpOptionFunction :: Cmd (Repl e t f m )
422+ , helpOptionFunction :: Cmd (Repl e f m )
415423 }
416424
417- type HelpOptions e t f m = [HelpOption e t f m ]
425+ type HelpOptions e f m = [HelpOption e f m ]
418426
419- helpOptions :: (MonadNix e t f m , MonadIO m ) => HelpOptions e t f m
427+ helpOptions :: (MonadNix e f m , MonadIO m ) => HelpOptions e f m
420428helpOptions =
421429 [ HelpOption
422430 " help"
@@ -513,10 +521,10 @@ renderSetOptions so =
513521 <> Prettyprinter. line
514522 <> Prettyprinter. indent 4 (helpSetOptionDoc h)
515523
516- help :: (MonadNix e t f m , MonadIO m )
517- => HelpOptions e t f m
524+ help :: (MonadNix e f m , MonadIO m )
525+ => HelpOptions e f m
518526 -> String
519- -> Repl e t f m ()
527+ -> Repl e f m ()
520528help hs _ = do
521529 liftIO $ putStrLn " Available commands:\n "
522530 forM_ hs $ \ h ->
@@ -532,6 +540,6 @@ help hs _ = do
532540 <> Prettyprinter. indent 4 (helpOptionDoc h)
533541
534542options
535- :: (MonadNix e t f m , MonadIO m )
536- => System.Console.Repline. Options (Repl e t f m )
543+ :: (MonadNix e f m , MonadIO m )
544+ => System.Console.Repline. Options (Repl e f m )
537545options = (\ h -> (helpOptionName h, helpOptionFunction h)) <$> helpOptions
0 commit comments