import Spa.Lattice

namespace Spa

def FiniteHeightLattice.transport {α β : Type*} [Lattice α] [Lattice β]
    [I : FiniteHeightLattice α] (f : α → β) (g : β → α)
    (hf : Monotone f) (hg : Monotone g)
    (hgf : ∀ a, g (f a) = a) (hfg : ∀ b, f (g b) = b) :
    FiniteHeightLattice β where
  bot := f ⊥
  top := f ⊤
  height := I.height
  longestChain :=
    { series :=
        I.longestChain.series.map f
          (hf.strictMono_of_injective (Function.LeftInverse.injective hgf))
      head_series := congrArg f I.longestChain.head_series
      last_series := congrArg f I.longestChain.last_series
      length_series := I.longestChain.length_series }
  chains_bounded := fun c =>
    I.chains_bounded
      (c.map g (hg.strictMono_of_injective (Function.LeftInverse.injective hfg)))

end Spa
