{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Cardano.Data.TreeDiff where

import Data.Foldable (Foldable (..))
import Data.Foldable qualified as F
import Data.Map.NonEmpty (NonEmptyMap)
import Data.Map.NonEmpty qualified as NEM
import Data.OMap.Strict
import Data.OSet.Strict
import Data.Set.NonEmpty (NonEmptySet)
import Data.Set.NonEmpty qualified as NES
import Test.Cardano.Ledger.Binary.TreeDiff (Expr (..), ToExpr (..))

instance ToExpr a => ToExpr (OSet a) where
  toExpr :: OSet a -> Expr
toExpr OSet a
x = ConstructorName -> [Expr] -> Expr
App ConstructorName
"OSet.fromList" [[a] -> Expr
forall a. ToExpr a => a -> Expr
toExpr ([a] -> Expr) -> [a] -> Expr
forall a b. (a -> b) -> a -> b
$ OSet a -> [a]
forall a. OSet a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList OSet a
x]

instance (HasOKey k v, ToExpr v) => ToExpr (OMap k v) where
  listToExpr :: [OMap k v] -> Expr
listToExpr = [OMap k v] -> Expr
forall a. ToExpr a => [a] -> Expr
listToExpr ([OMap k v] -> Expr)
-> ([OMap k v] -> [OMap k v]) -> [OMap k v] -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [OMap k v] -> [OMap k v]
forall a. [a] -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList
  toExpr :: OMap k v -> Expr
toExpr = [v] -> Expr
forall a. ToExpr a => a -> Expr
toExpr ([v] -> Expr) -> (OMap k v -> [v]) -> OMap k v -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OMap k v -> [v]
forall a. OMap k a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList

instance ToExpr a => ToExpr (NonEmptySet a) where
  toExpr :: NonEmptySet a -> Expr
toExpr = [a] -> Expr
forall a. ToExpr a => a -> Expr
toExpr ([a] -> Expr) -> (NonEmptySet a -> [a]) -> NonEmptySet a -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptySet a -> [a]
forall a. NonEmptySet a -> [a]
NES.toList

instance (Ord k, ToExpr k, ToExpr v) => ToExpr (NonEmptyMap k v) where
  listToExpr :: [NonEmptyMap k v] -> Expr
listToExpr = [NonEmptyMap k v] -> Expr
forall a. ToExpr a => [a] -> Expr
listToExpr ([NonEmptyMap k v] -> Expr)
-> ([NonEmptyMap k v] -> [NonEmptyMap k v])
-> [NonEmptyMap k v]
-> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [NonEmptyMap k v] -> [NonEmptyMap k v]
forall a. [a] -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList
  toExpr :: NonEmptyMap k v -> Expr
toExpr = [(k, v)] -> Expr
forall a. ToExpr a => a -> Expr
toExpr ([(k, v)] -> Expr)
-> (NonEmptyMap k v -> [(k, v)]) -> NonEmptyMap k v -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyMap k v -> [(k, v)]
forall k v. NonEmptyMap k v -> [(k, v)]
NEM.toList