{-
Build a list by calling the supplied function on all `Natural` numbers from `0`
up to but not including the supplied `Natural` number
-}
let generate
    : Natural → ∀(a : Type) → (Natural → a) → List a
    =   λ(n : Natural)
      → λ(a : Type)
      → λ(f : Natural → a)
      → List/build
          a
          (   λ(list : Type)
            → λ(cons : a → list → list)
            → List/fold
                { index : Natural, value : {} }
                ( List/indexed
                    {}
                    ( List/build
                        {}
                        (   λ(list : Type)
                          → λ(cons : {} → list → list)
                          → Natural/fold n list (cons {=})
                        )
                    )
                )
                list
                (λ(x : { index : Natural, value : {} }) → cons (f x.index))
          )

let example0 =
      assert : generate 5 Bool Natural/even ≡ [ True, False, True, False, True ]

let example1 = assert : generate 0 Bool Natural/even ≡ ([] : List Bool)

in  generate
