{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DerivingStrategies #-}

module Inferno.Types.Module where

import Data.Aeson (FromJSON, ToJSON)
import qualified Data.Map as Map
import qualified Data.Set as Set
import GHC.Generics (Generic)
import Inferno.Types.Syntax (Expr, ModuleName, OpsTable)
import Inferno.Types.Type (Namespace, TCScheme, TypeClass, TypeMetadata)
import Inferno.Types.VersionControl (VCHashUpdate, VCObjectHash)

data Module objs = Module
  { forall objs. Module objs -> ModuleName
moduleName :: ModuleName,
    forall objs. Module objs -> OpsTable
moduleOpsTable :: OpsTable,
    forall objs. Module objs -> Set TypeClass
moduleTypeClasses :: Set.Set TypeClass,
    forall objs. Module objs -> objs
moduleObjects :: objs
  }
  deriving (Module objs -> Module objs -> Bool
forall objs. Eq objs => Module objs -> Module objs -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Module objs -> Module objs -> Bool
$c/= :: forall objs. Eq objs => Module objs -> Module objs -> Bool
== :: Module objs -> Module objs -> Bool
$c== :: forall objs. Eq objs => Module objs -> Module objs -> Bool
Eq, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall objs x. Rep (Module objs) x -> Module objs
forall objs x. Module objs -> Rep (Module objs) x
$cto :: forall objs x. Rep (Module objs) x -> Module objs
$cfrom :: forall objs x. Module objs -> Rep (Module objs) x
Generic)
  deriving anyclass (forall objs.
VCHashUpdate objs =>
Context SHA256 -> Module objs -> Context SHA256
forall obj.
(Context SHA256 -> obj -> Context SHA256) -> VCHashUpdate obj
&< :: Context SHA256 -> Module objs -> Context SHA256
$c&< :: forall objs.
VCHashUpdate objs =>
Context SHA256 -> Module objs -> Context SHA256
VCHashUpdate, forall objs. ToJSON objs => [Module objs] -> Encoding
forall objs. ToJSON objs => [Module objs] -> Value
forall objs. ToJSON objs => Module objs -> Encoding
forall objs. ToJSON objs => Module objs -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Module objs] -> Encoding
$ctoEncodingList :: forall objs. ToJSON objs => [Module objs] -> Encoding
toJSONList :: [Module objs] -> Value
$ctoJSONList :: forall objs. ToJSON objs => [Module objs] -> Value
toEncoding :: Module objs -> Encoding
$ctoEncoding :: forall objs. ToJSON objs => Module objs -> Encoding
toJSON :: Module objs -> Value
$ctoJSON :: forall objs. ToJSON objs => Module objs -> Value
ToJSON, forall objs. FromJSON objs => Value -> Parser [Module objs]
forall objs. FromJSON objs => Value -> Parser (Module objs)
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Module objs]
$cparseJSONList :: forall objs. FromJSON objs => Value -> Parser [Module objs]
parseJSON :: Value -> Parser (Module objs)
$cparseJSON :: forall objs. FromJSON objs => Value -> Parser (Module objs)
FromJSON)

newtype BuiltinModuleHash = BuiltinModuleHash ModuleName
  deriving stock (forall x. Rep BuiltinModuleHash x -> BuiltinModuleHash
forall x. BuiltinModuleHash -> Rep BuiltinModuleHash x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep BuiltinModuleHash x -> BuiltinModuleHash
$cfrom :: forall x. BuiltinModuleHash -> Rep BuiltinModuleHash x
Generic)
  deriving anyclass (Context SHA256 -> BuiltinModuleHash -> Context SHA256
forall obj.
(Context SHA256 -> obj -> Context SHA256) -> VCHashUpdate obj
&< :: Context SHA256 -> BuiltinModuleHash -> Context SHA256
$c&< :: Context SHA256 -> BuiltinModuleHash -> Context SHA256
VCHashUpdate)

newtype BuiltinFunHash = BuiltinFunHash (Expr () (), TCScheme)
  deriving stock (forall x. Rep BuiltinFunHash x -> BuiltinFunHash
forall x. BuiltinFunHash -> Rep BuiltinFunHash x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep BuiltinFunHash x -> BuiltinFunHash
$cfrom :: forall x. BuiltinFunHash -> Rep BuiltinFunHash x
Generic)
  deriving anyclass (Context SHA256 -> BuiltinFunHash -> Context SHA256
forall obj.
(Context SHA256 -> obj -> Context SHA256) -> VCHashUpdate obj
&< :: Context SHA256 -> BuiltinFunHash -> Context SHA256
$c&< :: Context SHA256 -> BuiltinFunHash -> Context SHA256
VCHashUpdate)

newtype BuiltinEnumHash = BuiltinEnumHash TCScheme
  deriving stock (forall x. Rep BuiltinEnumHash x -> BuiltinEnumHash
forall x. BuiltinEnumHash -> Rep BuiltinEnumHash x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep BuiltinEnumHash x -> BuiltinEnumHash
$cfrom :: forall x. BuiltinEnumHash -> Rep BuiltinEnumHash x
Generic)
  deriving anyclass (Context SHA256 -> BuiltinEnumHash -> Context SHA256
forall obj.
(Context SHA256 -> obj -> Context SHA256) -> VCHashUpdate obj
&< :: Context SHA256 -> BuiltinEnumHash -> Context SHA256
$c&< :: Context SHA256 -> BuiltinEnumHash -> Context SHA256
VCHashUpdate)

type PinnedModule m =
  Module (Map.Map Namespace VCObjectHash, Map.Map VCObjectHash (TypeMetadata TCScheme), m)

pinnedModuleNameToHash :: PinnedModule m -> Map.Map Namespace VCObjectHash
pinnedModuleNameToHash :: forall m. PinnedModule m -> Map Namespace VCObjectHash
pinnedModuleNameToHash Module {moduleObjects :: forall objs. Module objs -> objs
moduleObjects = (Map Namespace VCObjectHash
hashes, Map VCObjectHash (TypeMetadata TCScheme)
_, m
_)} = Map Namespace VCObjectHash
hashes

pinnedModuleHashToTy :: PinnedModule m -> Map.Map VCObjectHash (TypeMetadata TCScheme)
pinnedModuleHashToTy :: forall m.
PinnedModule m -> Map VCObjectHash (TypeMetadata TCScheme)
pinnedModuleHashToTy Module {moduleObjects :: forall objs. Module objs -> objs
moduleObjects = (Map Namespace VCObjectHash
_, Map VCObjectHash (TypeMetadata TCScheme)
tys, m
_)} = Map VCObjectHash (TypeMetadata TCScheme)
tys

pinnedModuleTerms :: PinnedModule m -> m
pinnedModuleTerms :: forall m. PinnedModule m -> m
pinnedModuleTerms Module {moduleObjects :: forall objs. Module objs -> objs
moduleObjects = (Map Namespace VCObjectHash
_, Map VCObjectHash (TypeMetadata TCScheme)
_, m
trms)} = m
trms