{-
`partition` divides a `List` of elements into those that satisfy a predicate
and those that do not
-}
let Partition
    : Type → Type
    = λ(a : Type) → { true : List a, false : List a }

let partition
    : ∀(a : Type) → (a → Bool) → List a → Partition a
    =   λ(a : Type)
      → λ(f : a → Bool)
      → λ(xs : List a)
      → List/fold
          a
          xs
          (Partition a)
          (   λ(x : a)
            → λ(p : Partition a)
            →       if f x

              then  { true = [ x ] # p.true, false = p.false }

              else  { true = p.true, false = [ x ] # p.false }
          )
          { true = [] : List a, false = [] : List a }

let example0 =
        assert
      :   partition Natural Natural/even [ 0, 1, 2, 3 ]
        ≡ { true = [ 0, 2 ], false = [ 1, 3 ] }

in  partition
