import Lean

open Lean
open Lean.Meta

-- Return true if `declName` should be ignored
def shouldIgnore (declName : Name) : Bool :=
  declName.isInternal
  || match declName with
     | Name.str _ s _ => "match_".isPrefixOf s || "proof_".isPrefixOf s || "eq_".isPrefixOf s
     | _ => true

-- Print declarations that have the given prefix.
def printDecls (pre : Name) : MetaM Unit := do
  let cs := (← getEnv).constants
  cs.forM fun declName info => do
    if pre.isPrefixOf declName && !shouldIgnore declName then
      if let some docString := findDocString? (← getEnv) declName then
        IO.println s!"/-- {docString} -/\n{declName} : {← ppExpr info.type}"
      else
        IO.println s!"{declName} : {← ppExpr info.type}"

#eval printDecls `Array
#eval printDecls `List
#eval printDecls `Bool
#eval printDecls `Lean.Elab
