packages feed

nbparts-0.1.0.0: src/Nbparts/Types.hs

-- Since this module mostly re-exports the submodules,
-- we disable the warning.
{-# OPTIONS_GHC -Wno-missing-import-lists #-}

module Nbparts.Types
  ( module Nbparts.Types.Manifest,
    module Nbparts.Types.Sources,
    module Nbparts.Types.Outputs,
    module Nbparts.Types.Metadata,
    module Nbparts.Types.Mime,
    module Nbparts.Types.Error,
    SomeNotebook (..),
    withSomeNotebook,
  )
where

import Control.Applicative (Alternative ((<|>)))
import Data.Aeson qualified as Aeson
import Data.Ipynb qualified as Ipynb
import Nbparts.Types.Error
import Nbparts.Types.Manifest
import Nbparts.Types.Metadata
import Nbparts.Types.Mime
import Nbparts.Types.Outputs
import Nbparts.Types.Sources

data SomeNotebook where
  SomeNotebook :: (Aeson.ToJSON (Ipynb.Notebook a), Aeson.FromJSON (Ipynb.Notebook a)) => Ipynb.Notebook a -> SomeNotebook

withSomeNotebook :: SomeNotebook -> (forall a. (Aeson.ToJSON (Ipynb.Notebook a), Aeson.FromJSON (Ipynb.Notebook a)) => Ipynb.Notebook a -> r) -> r
withSomeNotebook (SomeNotebook nb) f = f nb

instance Show SomeNotebook where
  show (SomeNotebook nb) = "SomeNotebook (" <> show nb <> ")"

instance Aeson.ToJSON SomeNotebook where
  toJSON (SomeNotebook nb) = Aeson.toJSON nb

instance Aeson.FromJSON SomeNotebook where
  parseJSON v =
    SomeNotebook <$> (Aeson.parseJSON @(Ipynb.Notebook Ipynb.NbV3)) v
      <|> SomeNotebook <$> (Aeson.parseJSON @(Ipynb.Notebook Ipynb.NbV4)) v