module Managed.Probe.Internal.Params
  ( params
  , paramsCnt
  , returns
  ) where

import Data.Typeable

someFunction :: TypeRep
someFunction :: TypeRep
someFunction = Proxy (() -> ()) -> TypeRep
forall k (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy (() -> ())
forall k (t :: k). Proxy t
Proxy :: Proxy (() -> ()))

isFunction :: TypeRep -> Bool
isFunction :: TypeRep -> Bool
isFunction TypeRep
x =
  TyCon -> Fingerprint
tyConFingerprint (TypeRep -> TyCon
typeRepTyCon TypeRep
x) Fingerprint -> Fingerprint -> Bool
forall a. Eq a => a -> a -> Bool
==
  TyCon -> Fingerprint
tyConFingerprint (TypeRep -> TyCon
typeRepTyCon TypeRep
someFunction)

expand :: TypeRep -> [TypeRep]
expand :: TypeRep -> [TypeRep]
expand TypeRep
x =
  if TypeRep -> Bool
isFunction TypeRep
x
    then [TypeRep] -> [TypeRep]
flatten (TypeRep -> [TypeRep]
typeRepArgs TypeRep
x)
    else [TypeRep
x]

flatten :: [TypeRep] -> [TypeRep]
flatten :: [TypeRep] -> [TypeRep]
flatten = (TypeRep -> [TypeRep]) -> [TypeRep] -> [TypeRep]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap TypeRep -> [TypeRep]
expand

params :: TypeRep -> [TypeRep]
params :: TypeRep -> [TypeRep]
params = [TypeRep] -> [TypeRep]
forall a. [a] -> [a]
init ([TypeRep] -> [TypeRep])
-> (TypeRep -> [TypeRep]) -> TypeRep -> [TypeRep]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypeRep -> [TypeRep]
expand

paramsCnt :: TypeRep -> Int
paramsCnt :: TypeRep -> Int
paramsCnt = [TypeRep] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([TypeRep] -> Int) -> (TypeRep -> [TypeRep]) -> TypeRep -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypeRep -> [TypeRep]
params

returns :: TypeRep -> TypeRep
returns :: TypeRep -> TypeRep
returns = [TypeRep] -> TypeRep
forall a. [a] -> a
last ([TypeRep] -> TypeRep)
-> (TypeRep -> [TypeRep]) -> TypeRep -> TypeRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypeRep -> [TypeRep]
expand