2018-04-14 03:09:12 +02:00
|
|
|
{-# LANGUAGE ConstraintKinds #-}
|
|
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
|
|
{-# LANGUAGE FlexibleInstances #-}
|
|
|
|
{-# LANGUAGE LambdaCase #-}
|
|
|
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
|
|
|
{-# LANGUAGE MultiWayIf #-}
|
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
{-# LANGUAGE ScopedTypeVariables #-}
|
|
|
|
{-# LANGUAGE TypeApplications #-}
|
|
|
|
{-# LANGUAGE UndecidableInstances #-}
|
|
|
|
|
|
|
|
{-# OPTIONS_GHC -Wno-missing-signatures #-}
|
|
|
|
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
|
|
|
|
|
|
|
|
module Nix.Convert where
|
|
|
|
|
|
|
|
import Control.Monad
|
|
|
|
import Data.Aeson (toJSON)
|
|
|
|
import qualified Data.Aeson as A
|
2018-04-15 07:58:50 +02:00
|
|
|
import Data.ByteString
|
2018-04-14 03:09:12 +02:00
|
|
|
import Data.Fix
|
|
|
|
import Data.HashMap.Lazy (HashMap)
|
|
|
|
import qualified Data.HashMap.Lazy as M
|
2018-04-15 07:58:50 +02:00
|
|
|
import Data.Scientific
|
2018-04-14 03:09:12 +02:00
|
|
|
import Data.Text (Text)
|
2018-04-15 08:52:21 +02:00
|
|
|
import qualified Data.Text as Text
|
2018-04-15 07:58:50 +02:00
|
|
|
import Data.Text.Encoding (encodeUtf8, decodeUtf8)
|
2018-04-14 03:09:12 +02:00
|
|
|
import qualified Data.Vector as V
|
|
|
|
import Nix.Atoms
|
|
|
|
import Nix.Effects
|
|
|
|
import Nix.Expr.Types
|
|
|
|
import Nix.Expr.Types.Annotated
|
|
|
|
import Nix.Normal
|
|
|
|
import Nix.Stack
|
|
|
|
import Nix.Thunk
|
|
|
|
import Nix.Value
|
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
class FromValue a m v where
|
|
|
|
fromValue :: v -> m a
|
2018-04-16 01:21:47 +02:00
|
|
|
fromNixMay :: v -> m (Maybe a)
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Bool m (NValueNF m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVConstant (NBool b)) -> pure $ Just b
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a bool, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Bool m (NValue m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
NVConstant (NBool b) -> pure $ Just b
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a bool, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Int m (NValueNF m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVConstant (NInt b)) -> pure $ Just (fromInteger b)
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected an integer, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Int m (NValue m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
NVConstant (NInt b) -> pure $ Just (fromInteger b)
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected an integer, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Integer m (NValueNF m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVConstant (NInt b)) -> pure $ Just b
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected an integer, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Integer m (NValue m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
NVConstant (NInt b) -> pure $ Just b
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected an integer, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Float m (NValueNF m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVConstant (NFloat b)) -> pure $ Just b
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a float, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Float m (NValue m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
NVConstant (NFloat b) -> pure $ Just b
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a float, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Text m (NValueNF m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVStr t _) -> pure $ Just t
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a string, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Text m (NValue m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
NVStr t _ -> pure $ Just t
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a string, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue ByteString m (NValueNF m) where
|
2018-04-15 07:58:50 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVStr t _) -> pure $ Just (encodeUtf8 t)
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-15 07:58:50 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a string, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue ByteString m (NValue m) where
|
2018-04-15 07:58:50 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
NVStr t _ -> pure $ Just (encodeUtf8 t)
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-15 07:58:50 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a string, but saw: " ++ show v
|
|
|
|
|
2018-04-14 03:09:12 +02:00
|
|
|
newtype Path = Path { getPath :: FilePath }
|
|
|
|
deriving Show
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Path m (NValueNF m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVPath p) -> pure $ Just (Path p)
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a path, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue Path m (NValue m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
NVPath p -> pure $ Just (Path p)
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a path, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m,
|
2018-04-16 04:05:44 +02:00
|
|
|
FromValue a m (NValueNF m), Show a)
|
|
|
|
=> FromValue [a] m (NValueNF m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
2018-04-15 10:43:01 +02:00
|
|
|
Fix (NVList l) -> sequence <$> traverse fromNixMay l
|
2018-04-14 03:09:12 +02:00
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
2018-04-15 07:58:50 +02:00
|
|
|
v -> throwError $ "Expected an attrset, but saw: " ++ show v
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-15 10:46:08 +02:00
|
|
|
-- jww (2018-04-15): This instance does not work, because when the desired
|
2018-04-16 04:05:44 +02:00
|
|
|
-- conversion is FromValue [NThunk m] m (NValue m), we then use traverse with
|
|
|
|
-- FromValue (NThunk m) m (NValue m), and this use of 'traverse' causes the
|
2018-04-15 10:46:08 +02:00
|
|
|
-- monadic effects to be sequence'd too early.
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
-- instance (Framed e m, MonadVar m, MonadFile m) => (MonadThunk (NValue m) (NThunk m) m,
|
2018-04-16 04:05:44 +02:00
|
|
|
-- FromValue a m (NValue m), Show a) => FromValue [a] m (NValue m) where
|
2018-04-15 10:43:01 +02:00
|
|
|
-- fromNixMay = \case
|
|
|
|
-- NVList l -> sequence <$> traverse (`force` fromNixMay) l
|
|
|
|
-- _ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
-- fromValue = fromNixMay >=> \case
|
2018-04-15 10:43:01 +02:00
|
|
|
-- Just b -> pure b
|
|
|
|
-- v -> throwError $ "Expected an attrset, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue [NThunk m] m (NValue m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
2018-04-15 10:43:01 +02:00
|
|
|
NVList l -> pure $ Just l
|
2018-04-14 03:09:12 +02:00
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
2018-04-15 07:58:50 +02:00
|
|
|
v -> throwError $ "Expected an attrset, but saw: " ++ show v
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue (HashMap Text (NValueNF m)) m (NValueNF m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVSet s _) -> pure $ Just s
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected an attrset, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
-- instance (Framed e m, MonadVar m, MonadFile m) => (MonadThunk (NValue m) (NThunk m) m,
|
2018-04-16 04:05:44 +02:00
|
|
|
-- FromValue a m (NValue m), Show a)
|
|
|
|
-- => FromValue (HashMap Text a) m (NValue m) where
|
2018-04-15 10:43:01 +02:00
|
|
|
-- fromNixMay = \case
|
|
|
|
-- NVSet s _ -> sequence <$> traverse (`force` fromNixMay) s
|
|
|
|
-- _ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
-- fromValue = fromNixMay >=> \case
|
2018-04-15 10:43:01 +02:00
|
|
|
-- Just b -> pure b
|
|
|
|
-- v -> throwError $ "Expected an attrset, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue (HashMap Text (NThunk m)) m (NValue m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
NVSet s _ -> pure $ Just s
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected an attrset, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue (HashMap Text (NValueNF m),
|
2018-04-16 01:21:47 +02:00
|
|
|
HashMap Text SourcePos) m (NValueNF m) where
|
2018-04-15 08:52:21 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVSet s p) -> pure $ Just (s, p)
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-15 08:52:21 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected an attrset, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue (HashMap Text (NThunk m),
|
2018-04-16 01:21:47 +02:00
|
|
|
HashMap Text SourcePos) m (NValue m) where
|
2018-04-15 08:52:21 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
NVSet s p -> pure $ Just (s, p)
|
|
|
|
_ -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-15 08:52:21 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected an attrset, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (MonadThunk (NValue m) (NThunk m) m,
|
|
|
|
Framed e m, MonadVar m, MonadFile m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue (NThunk m) m (NValue m) where
|
2018-04-15 07:58:50 +02:00
|
|
|
fromNixMay = pure . Just . value @_ @_ @m
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-15 07:58:50 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Expected a thunk, but saw: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m, MonadEffects m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue A.Value m (NValueNF m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = \case
|
|
|
|
Fix (NVConstant a) -> pure $ Just $ case a of
|
|
|
|
NInt n -> toJSON n
|
|
|
|
NFloat n -> toJSON n
|
|
|
|
NBool b -> toJSON b
|
|
|
|
NNull -> A.Null
|
|
|
|
NUri u -> toJSON u
|
|
|
|
Fix (NVStr s _) -> pure $ Just $ toJSON s
|
|
|
|
Fix (NVList l) -> fmap (A.Array . V.fromList) . sequence
|
|
|
|
<$> traverse fromNixMay l
|
|
|
|
Fix (NVSet m _) -> fmap A.Object . sequence <$> traverse fromNixMay m
|
|
|
|
Fix NVClosure {} -> pure Nothing
|
|
|
|
Fix (NVPath p) -> Just . toJSON . unStorePath <$> addPath p
|
|
|
|
Fix (NVBuiltin _ _) -> pure Nothing
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = fromNixMay >=> \case
|
2018-04-14 03:09:12 +02:00
|
|
|
Just b -> pure b
|
|
|
|
v -> throwError $ "Cannot convert value to JSON: " ++ show v
|
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance (Framed e m, MonadVar m, MonadFile m,
|
|
|
|
MonadThunk (NValue m) (NThunk m) m, MonadEffects m)
|
2018-04-16 04:05:44 +02:00
|
|
|
=> FromValue A.Value m (NValue m) where
|
2018-04-14 03:09:12 +02:00
|
|
|
fromNixMay = normalForm >=> fromNixMay
|
2018-04-16 04:05:44 +02:00
|
|
|
fromValue = normalForm >=> fromValue
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
class ToValue a m v where
|
|
|
|
toValue :: a -> m v
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Bool m (NValueNF m) where
|
|
|
|
toValue = pure . Fix . NVConstant . NBool
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Bool m (NValue m) where
|
|
|
|
toValue = pure . NVConstant . NBool
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Int m (NValueNF m) where
|
|
|
|
toValue = pure . Fix . NVConstant . NInt . toInteger
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Int m (NValue m) where
|
|
|
|
toValue = pure . NVConstant . NInt . toInteger
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Integer m (NValueNF m) where
|
|
|
|
toValue = pure . Fix . NVConstant . NInt
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Integer m (NValue m) where
|
|
|
|
toValue = pure . NVConstant . NInt
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Float m (NValueNF m) where
|
|
|
|
toValue = pure . Fix . NVConstant . NFloat
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Float m (NValue m) where
|
|
|
|
toValue = pure . NVConstant . NFloat
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Text m (NValueNF m) where
|
|
|
|
toValue = pure . Fix . flip NVStr mempty
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Text m (NValue m) where
|
|
|
|
toValue = pure . flip NVStr mempty
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue ByteString m (NValueNF m) where
|
|
|
|
toValue = pure . Fix . flip NVStr mempty . decodeUtf8
|
2018-04-15 07:58:50 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue ByteString m (NValue m) where
|
|
|
|
toValue = pure . flip NVStr mempty . decodeUtf8
|
2018-04-15 07:58:50 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Path m (NValueNF m) where
|
|
|
|
toValue = pure . Fix . NVPath . getPath
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Path m (NValue m) where
|
|
|
|
toValue = pure . NVPath . getPath
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-15 08:52:21 +02:00
|
|
|
instance MonadThunk (NValue m) (NThunk m) m
|
2018-04-16 04:05:44 +02:00
|
|
|
=> ToValue SourcePos m (NValue m) where
|
|
|
|
toValue (SourcePos f l c) = do
|
|
|
|
f' <- toValue @_ @_ @(NValue m) (Text.pack f)
|
|
|
|
l' <- toValue (unPos l)
|
|
|
|
c' <- toValue (unPos c)
|
2018-04-16 01:21:47 +02:00
|
|
|
let pos = M.fromList
|
2018-04-15 10:43:01 +02:00
|
|
|
[ ("file" :: Text, value @_ @_ @m f')
|
|
|
|
, ("line", value @_ @_ @m l')
|
|
|
|
, ("column", value @_ @_ @m c') ]
|
2018-04-16 01:21:47 +02:00
|
|
|
pure $ NVSet pos mempty
|
2018-04-15 08:52:21 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance (ToValue a m (NValueNF m), Applicative m)
|
|
|
|
=> ToValue [a] m (NValueNF m) where
|
|
|
|
toValue = fmap (Fix . NVList) . traverse toValue
|
2018-04-15 10:43:01 +02:00
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
-- instance Applicative m => (MonadThunk (NValue m) (NThunk m) m,
|
2018-04-16 04:05:44 +02:00
|
|
|
-- ToValue a m (NValue m)) => ToValue [a] m (NValue m) where
|
|
|
|
-- toValue = pure . NVList . fmap toValue
|
2018-04-15 10:43:01 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue [NThunk m] m (NValue m) where
|
|
|
|
toValue = pure . NVList
|
2018-04-15 10:43:01 +02:00
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
instance Applicative m
|
2018-04-16 04:05:44 +02:00
|
|
|
=> ToValue (HashMap Text (NValueNF m)) m (NValueNF m) where
|
|
|
|
toValue = pure . Fix . flip NVSet M.empty
|
2018-04-15 08:52:21 +02:00
|
|
|
|
2018-04-16 01:21:47 +02:00
|
|
|
-- instance Applicative m => (MonadThunk (NValue m) (NThunk m) m,
|
2018-04-16 04:05:44 +02:00
|
|
|
-- ToValue a m (NValue m))
|
|
|
|
-- => ToValue (HashMap Text a) m (NValue m) where
|
|
|
|
-- toValue = pure . flip NVSet M.empty . fmap toValue
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue (HashMap Text (NThunk m)) m (NValue m) where
|
|
|
|
toValue = pure . flip NVSet M.empty
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue (HashMap Text (NValueNF m),
|
2018-04-16 01:21:47 +02:00
|
|
|
HashMap Text SourcePos) m (NValueNF m) where
|
2018-04-16 04:05:44 +02:00
|
|
|
toValue (s, p) = pure $ Fix $ NVSet s p
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue (HashMap Text (NThunk m),
|
2018-04-16 01:21:47 +02:00
|
|
|
HashMap Text SourcePos) m (NValue m) where
|
2018-04-16 04:05:44 +02:00
|
|
|
toValue (s, p) = pure $ NVSet s p
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance (MonadThunk (NValue m) (NThunk m) m, ToValue a m (NValue m))
|
|
|
|
=> ToValue a m (NThunk m) where
|
|
|
|
toValue = fmap (value @(NValue m) @_ @m) . toValue
|
2018-04-14 03:09:12 +02:00
|
|
|
|
2018-04-16 04:05:44 +02:00
|
|
|
instance Applicative m => ToValue Bool m (NExprF r) where
|
|
|
|
toValue = pure . NConstant . NBool
|
2018-04-15 07:58:50 +02:00
|
|
|
|
|
|
|
instance MonadThunk (NValue m) (NThunk m) m
|
2018-04-16 04:05:44 +02:00
|
|
|
=> ToValue A.Value m (NValue m) where
|
|
|
|
toValue = \case
|
2018-04-16 01:21:47 +02:00
|
|
|
A.Object m -> flip NVSet M.empty
|
2018-04-16 04:05:44 +02:00
|
|
|
<$> traverse (thunk . toValue @_ @_ @(NValue m)) m
|
|
|
|
A.Array l -> NVList <$> traverse (thunk . toValue) (V.toList l)
|
2018-04-16 01:21:47 +02:00
|
|
|
A.String s -> pure $ NVStr s mempty
|
|
|
|
A.Number n -> pure $ NVConstant $ case floatingOrInteger n of
|
2018-04-15 07:58:50 +02:00
|
|
|
Left r -> NFloat r
|
|
|
|
Right i -> NInt i
|
2018-04-16 01:21:47 +02:00
|
|
|
A.Bool b -> pure $ NVConstant $ NBool b
|
|
|
|
A.Null -> pure $ NVConstant NNull
|