{-# OPTIONS_GHC -Wno-orphans #-}

module Ouroboros.Consensus.HardFork.Combinator.Node.Metrics () where

import           Data.SOP.BasicFunctors
import           Data.SOP.Strict
import           Ouroboros.Consensus.Block.SupportsMetrics
import           Ouroboros.Consensus.HardFork.Combinator.Abstract
import           Ouroboros.Consensus.HardFork.Combinator.AcrossEras
import           Ouroboros.Consensus.HardFork.Combinator.Basics
import           Ouroboros.Consensus.HardFork.Combinator.Block
import           Ouroboros.Consensus.Util

instance CanHardFork xs => BlockSupportsMetrics (HardForkBlock xs) where
  isSelfIssued :: BlockConfig (HardForkBlock xs)
-> Header (HardForkBlock xs) -> WhetherSelfIssued
isSelfIssued BlockConfig (HardForkBlock xs)
cfg Header (HardForkBlock xs)
hdr =
        NS (K WhetherSelfIssued) xs -> CollapseTo NS WhetherSelfIssued
forall (xs :: [*]) a.
SListIN NS xs =>
NS (K a) xs -> CollapseTo NS a
forall k l (h :: (k -> *) -> l -> *) (xs :: l) a.
(HCollapse h, SListIN h xs) =>
h (K a) xs -> CollapseTo h a
hcollapse
      (NS (K WhetherSelfIssued) xs -> CollapseTo NS WhetherSelfIssued)
-> NS (K WhetherSelfIssued) xs -> CollapseTo NS WhetherSelfIssued
forall a b. (a -> b) -> a -> b
$ Proxy SingleEraBlock
-> (forall a.
    SingleEraBlock a =>
    BlockConfig a -> Header a -> K WhetherSelfIssued a)
-> Prod NS BlockConfig xs
-> NS Header xs
-> NS (K WhetherSelfIssued) xs
forall {k} {l} (h :: (k -> *) -> l -> *) (c :: k -> Constraint)
       (xs :: l) (proxy :: (k -> Constraint) -> *) (f :: k -> *)
       (f' :: k -> *) (f'' :: k -> *).
(AllN (Prod h) c xs, HAp h, HAp (Prod h)) =>
proxy c
-> (forall (a :: k). c a => f a -> f' a -> f'' a)
-> Prod h f xs
-> h f' xs
-> h f'' xs
hczipWith
          Proxy SingleEraBlock
proxySingle
          (WhetherSelfIssued -> K WhetherSelfIssued a
forall k a (b :: k). a -> K a b
K (WhetherSelfIssued -> K WhetherSelfIssued a)
-> (BlockConfig a -> Header a -> WhetherSelfIssued)
-> BlockConfig a
-> Header a
-> K WhetherSelfIssued a
forall y z x0 x1. (y -> z) -> (x0 -> x1 -> y) -> x0 -> x1 -> z
.: BlockConfig a -> Header a -> WhetherSelfIssued
forall blk.
BlockSupportsMetrics blk =>
BlockConfig blk -> Header blk -> WhetherSelfIssued
isSelfIssued)
          (PerEraBlockConfig xs -> NP BlockConfig xs
forall (xs :: [*]). PerEraBlockConfig xs -> NP BlockConfig xs
getPerEraBlockConfig (PerEraBlockConfig xs -> NP BlockConfig xs)
-> PerEraBlockConfig xs -> NP BlockConfig xs
forall a b. (a -> b) -> a -> b
$ BlockConfig (HardForkBlock xs) -> PerEraBlockConfig xs
forall (xs :: [*]).
BlockConfig (HardForkBlock xs) -> PerEraBlockConfig xs
hardForkBlockConfigPerEra BlockConfig (HardForkBlock xs)
cfg)
          (OneEraHeader xs -> NS Header xs
forall (xs :: [*]). OneEraHeader xs -> NS Header xs
getOneEraHeader      (OneEraHeader xs -> NS Header xs)
-> OneEraHeader xs -> NS Header xs
forall a b. (a -> b) -> a -> b
$ Header (HardForkBlock xs) -> OneEraHeader xs
forall (xs :: [*]). Header (HardForkBlock xs) -> OneEraHeader xs
getHardForkHeader         Header (HardForkBlock xs)
hdr)