packages feed

idris-0.12: test/regression001/reg062.lidr

This is a test to make sure that #2130 doesn't re-break.

> import Data.Vect
> import Data.Fin

> %default total 

> idSuccPreservesLTE : (m : Nat) -> (n : Nat) -> m `LTE` n -> m `LTE` (S n)
> idSuccPreservesLTE  Z     n    prf = LTEZero
> idSuccPreservesLTE (S m)  Z    prf = absurd prf
> idSuccPreservesLTE (S m) (S n) prf = LTESucc (idSuccPreservesLTE m n (fromLteSucc prf))

> ltZS : (m : Nat) -> LT Z (S m)
> ltZS  Z    = LTESucc LTEZero 
> ltZS (S m) = idSuccPreservesLTE (S Z) (S m) (ltZS m)

> record Preorder : {T : Type} -> (T -> T -> Type) -> Type where
>   MkPreorder : {T : Type} -> 
>                (R : T -> T -> Type) ->
>                (reflexive : (x : T) -> R x x) ->
>                (transitive : (x : T) -> (y : T) -> (z : T) -> R x y -> R y z -> R x z) ->
>                Preorder R

> record TotalPreorder : {T : Type} -> (T -> T -> Type) -> Type where
>   MkTotalPreorder : {T : Type} -> 
>                     (R : T -> T -> Type) ->
>                     (reflexive : (x : T) -> R x x) ->
>                     (transitive : (x : T) -> (y : T) -> (z : T) -> R x y -> R y z -> R x z) ->
>                     (either : (x : T) -> (y : T) -> Either (R x y) (R y x)) ->
>                     TotalPreorder R

> argmaxMax : {A : Type} -> {R : A -> A -> Type} -> TotalPreorder {T = A} R -> 
>             Vect n A -> LT Z n -> (Fin n, A)
> argmaxMax         {n = Z}       tp  Nil                p = absurd p
> argmaxMax         {n = S Z}     tp (a :: Nil)          _ = (FZ, a)
> argmaxMax {A} {R} {n = S (S m)} (MkTotalPreorder R r t e) (a' :: (a'' :: as)) _ 
>   with (argmaxMax (MkTotalPreorder {T = A} R r t e) (a'' :: as) (ltZS m))
>     | (k, max) with (e a' max)
>       | (Left  _) = (FS k, max)
>       | (Right _) = (FZ, a')