Source code on Github
------------------------------------------------------------------------
-- Non-empty lists.

{-# OPTIONS --safe #-}
module Prelude.Lists.NonEmpty where

open import Prelude.Init; open SetAsType
open L.NE
open import Prelude.Bifunctor
open import Prelude.Null
open import Prelude.Lists.Empty

private variable A : Type ; x y : A; xs : List⁺ A

-- List⁺
All⁺ : Pred A ℓ′  List⁺ A  Type _
All⁺ P = All P  toList

toList⁺ :  (xs : List A)  xs  []  List⁺ A
toList⁺ []       ¬[] = ⊥-elim $ ¬[] refl
toList⁺ (x  xs) _   = x  xs

toList∘toList⁺ :  {A : Type } (xs : List A) (xs≢[] : ¬Null xs)
   toList (toList⁺ xs xs≢[])  xs
toList∘toList⁺ [] ¬n     = ⊥-elim $ ¬n refl
toList∘toList⁺ (_  _) _ = refl

All⇒All⁺ :  {A : Type } {xs : List A} {p : ¬Null xs} {P : Pred₀ A}
   All P xs
   All⁺ P (toList⁺ xs p)
All⇒All⁺ {xs = xs} {p} ∀P rewrite toList∘toList⁺ xs p = ∀P

last-∷ʳ :  {xs : List A}  L.last (xs L.∷ʳ x)  just x
last-∷ʳ {xs = []} = refl
last-∷ʳ {xs = _  []} = refl
last-∷ʳ {xs = _  xs@(_  _)} = last-∷ʳ {xs = xs}

∷ʳ-≗ :  {xs : List A}  L.NE.toList (xs L.NE.∷ʳ x)  (xs L.∷ʳ x)
∷ʳ-≗ {xs = []} = refl
∷ʳ-≗ {xs = _  []} = refl
∷ʳ-≗ {xs = _  _  _} = refl

last′ :  {xs : List⁺ A}  SnocView xs  A
last′ (_ ∷ʳ′ y) = y

last′≡ :  {xs : List⁺ A}  last xs  last′ (snocView xs)
last′≡ {xs = xs} with _ ∷ʳ′ _snocView xs = refl

snocView-∷⁺ : last′ (snocView (x ∷⁺ xs))  last′ (snocView xs)
snocView-∷⁺ {xs = _  xs} with L.initLast xs
... | [] = refl
... | _ L.∷ʳ′ _ = refl

last-∷ : last (x ∷⁺ xs)  last xs
last-∷ {x = x} {xs = xs} =
  begin last (x ∷⁺ xs)             ≡⟨ last′≡ {xs = x ∷⁺ xs} 
        last′ (snocView (x ∷⁺ xs)) ≡⟨ snocView-∷⁺ {xs = xs} 
        last′ (snocView xs)        ≡˘⟨ last′≡ {xs = xs} 
        last xs                     where open ≡-Reasoning

All⁺-last :  {P : Pred₀ A}  All⁺ P xs  P (last xs)
All⁺-last {xs = x  []}     (px  []) = px
All⁺-last {xs = x  y  xs} (_   ∀p) rewrite last-∷ {x = x}{y  xs} = All⁺-last ∀p