Skip to content

Commit 2c9bf24

Browse files
nickdrozdgallais
authored andcommitted
[ libs ] Strengthen some totality checks (#2304)
1 parent 1776efa commit 2c9bf24

File tree

9 files changed

+26
-18
lines changed

9 files changed

+26
-18
lines changed

libs/base/Data/Fuel.idr

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ limit (S n) = More (limit n)
1414

1515
||| Provide fuel indefinitely.
1616
||| This function is fundamentally partial.
17-
partial
1817
export
18+
covering
1919
forever : Fuel
2020
forever = More forever

libs/base/Data/Nat.idr

+4-2
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,8 @@ export partial
348348
divNat : Nat -> Nat -> Nat
349349
divNat left (S right) = divNatNZ left (S right) SIsNonZero
350350

351-
export partial
351+
export
352+
covering
352353
divCeilNZ : Nat -> (y: Nat) -> (0 _ : NonZero y) -> Nat
353354
divCeilNZ x y p = case (modNatNZ x y p) of
354355
Z => divNatNZ x y p
@@ -379,7 +380,8 @@ Integral Nat where
379380
div = divNat
380381
mod = modNat
381382

382-
export partial
383+
export
384+
covering
383385
gcd : (a: Nat) -> (b: Nat) -> {auto ok: NotBothZero a b} -> Nat
384386
gcd a Z = a
385387
gcd Z b = b

libs/base/Data/String.idr

+2-2
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,11 @@ public export partial
241241
strIndex : String -> Int -> Char
242242
strIndex = prim__strIndex
243243

244-
public export partial
244+
public export covering
245245
strLength : String -> Int
246246
strLength = prim__strLength
247247

248-
public export partial
248+
public export covering
249249
strSubstr : Int -> Int -> String -> String
250250
strSubstr = prim__strSubstr
251251

libs/base/System/File/ReadWrite.idr

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ readFilePage offset fuel fname
203203
|||
204204
||| @ fname the name of the file to read
205205
export
206-
partial
206+
covering
207207
readFile : HasIO io => (fname : String) -> io (Either FileError String)
208208
readFile = (map $ map (fastConcat . snd)) . readFilePage 0 forever
209209

libs/contrib/Data/List/TailRec.idr

+10-6
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,21 @@ import Syntax.WithProof
2222
import Data.List
2323
import Data.List1
2424

25-
total
25+
%default total
26+
2627
lengthAcc : List a -> Nat -> Nat
2728
lengthAcc [] acc = acc
2829
lengthAcc (_::xs) acc = lengthAcc xs $ S acc
2930

30-
export total
31+
export
3132
length : List a -> Nat
3233
length xs = lengthAcc xs Z
3334

34-
total
3535
lengthAccSucc : (xs : List a) -> (n : Nat) -> lengthAcc xs (S n) = S (lengthAcc xs n)
3636
lengthAccSucc [] _ = Refl
3737
lengthAccSucc (_::xs) n = rewrite lengthAccSucc xs (S n) in cong S Refl
3838

39-
export total
39+
export
4040
length_ext : (xs : List a) -> List.length xs = Data.List.TailRec.length xs
4141
length_ext [] = Refl
4242
length_ext (_::xs) = rewrite length_ext xs in sym $ lengthAccSucc xs Z
@@ -121,7 +121,7 @@ splitOnto : List (List a) -> (a -> Bool) -> List a -> List1 (List a)
121121
splitOnto acc p xs =
122122
case Data.List.break p xs of
123123
(chunk, [] ) => reverseOnto (chunk ::: []) acc
124-
(chunk, (c::rest)) => splitOnto (chunk::acc) p rest
124+
(chunk, (c::rest)) => splitOnto (chunk::acc) p $ assert_smaller xs rest
125125

126126
export
127127
split : (a -> Bool) -> List a -> List1 (List a)
@@ -136,7 +136,7 @@ splitOnto_ext acc p xs with (@@(Data.List.break p xs))
136136
Refl
137137
splitOnto_ext acc p xs | ((chunk, c::rest)**pf) =
138138
rewrite pf in
139-
rewrite splitOnto_ext (chunk::acc) p rest in
139+
rewrite splitOnto_ext (chunk::acc) p $ assert_smaller xs rest in
140140
Refl
141141

142142
export
@@ -272,6 +272,7 @@ sorted (x :: xs@(y :: ys)) = case (x <= y) of
272272
True => Data.List.TailRec.sorted xs
273273

274274
export
275+
covering
275276
sorted_ext : Ord a => (xs : List a) ->
276277
Data.List.sorted xs = Data.List.TailRec.sorted xs
277278
sorted_ext [] = Refl
@@ -289,6 +290,7 @@ mergeByOnto acc order left@(x::xs) right@(y::ys) =
289290
LT => mergeByOnto (x :: acc) order (assert_smaller left xs) right
290291
_ => mergeByOnto (y :: acc) order left (assert_smaller right ys)
291292

293+
covering
292294
mergeByOnto_ext : (acc : List a)
293295
-> (order : a -> a -> Ordering)
294296
-> (left, right : List a)
@@ -313,6 +315,7 @@ mergeBy : (a -> a -> Ordering) -> List a -> List a -> List a
313315
mergeBy order left right = mergeByOnto [] order left right
314316

315317
export
318+
covering
316319
mergeBy_ext : (order : a -> a -> Ordering) -> (left, right : List a) ->
317320
Data.List.mergeBy order left right =
318321
Data.List.TailRec.mergeBy order left right
@@ -323,6 +326,7 @@ merge : Ord a => List a -> List a -> List a
323326
merge = Data.List.TailRec.mergeBy compare
324327

325328
export
329+
covering
326330
merge_ext : Ord a => (left, right : List a) ->
327331
Data.List.merge left right = Data.List.TailRec.merge left right
328332
merge_ext left right = mergeBy_ext compare left right

libs/contrib/Data/List/Views/Extra.idr

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ data LazyFilterRec : List a -> Type where
146146

147147
||| Covering function for the LazyFilterRec view.
148148
||| Constructs the view lazily in linear time.
149-
total export
149+
export
150150
lazyFilterRec : (pred : (a -> Bool)) -> (xs : List a) -> LazyFilterRec xs
151151
lazyFilterRec pred [] = Exhausted []
152152
lazyFilterRec pred (x :: xs) with (pred x)

libs/contrib/Data/Vect/Sort.idr

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ module Data.Vect.Sort
33
import Data.Vect
44
import Data.Nat.Views
55

6+
%default total
7+
68
mutual
79
sortBySplit : (n : Nat) -> (a -> a -> Ordering) -> Vect n a -> Vect n a
810
sortBySplit Z cmp [] = []
@@ -19,10 +21,10 @@ mutual
1921
(sortBySplit m cmp (assert_smaller xs right))
2022

2123
||| Merge sort implementation for Vect n a
22-
export total
24+
export
2325
sortBy : {n : Nat} -> (cmp : a -> a -> Ordering) -> (xs : Vect n a) -> Vect n a
2426
sortBy cmp xs = sortBySplit n cmp xs
2527

26-
export total
28+
export
2729
sort : Ord a => {n : Nat} -> Vect n a -> Vect n a
2830
sort = sortBy compare

libs/contrib/Data/Vect/Views/Extra.idr

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Control.WellFounded
55
import Data.Vect
66
import Data.Nat
77

8+
%default total
89

910
||| View for splitting a vector in half, non-recursively
1011
public export
@@ -16,7 +17,6 @@ data Split : Vect n a -> Type where
1617
(x : a) -> (xs : Vect n a) -> (y : a) -> (ys : Vect m a) ->
1718
Split (x :: xs ++ y :: ys)
1819

19-
total
2020
splitHelp : {n : Nat} -> (head : a) -> (zs : Vect n a) ->
2121
Nat -> Split (head :: zs)
2222
splitHelp head [] _ = SplitOne
@@ -29,7 +29,7 @@ splitHelp head (z :: zs) (S (S k))
2929

3030
||| Covering function for the `Split` view
3131
||| Constructs the view in linear time
32-
export total
32+
export
3333
split : {n : Nat} -> (xs : Vect n a) -> Split xs
3434
split [] = SplitNil
3535
split {n = S k} (x :: xs) = splitHelp x xs k

libs/network/Network/Socket.idr

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ export
174174
recvAll : HasIO io => (sock : Socket) -> io (Either SocketError String)
175175
recvAll sock = recvRec sock [] 64
176176
where
177-
partial
177+
covering
178178
recvRec : Socket -> List String -> ByteLength -> io (Either SocketError String)
179179
recvRec sock acc n = do res <- recv sock n
180180
case res of

0 commit comments

Comments
 (0)