on master help sign in
Add Data.Primitives.Views

Collect the primitive views in one file and add an 'Int' version of the divides view

commit986e616f7d61a7b004fab600671dce498c5fbae6 authorEdwin Brady <ecb10@st-andrews.ac.uk> dateTue 17 May 2016, 16:26 (10 years ago) parent8805b35
4 files changed+51−21
idris.cabal+1−1 libs/base/Data/Integer/Views.idr−19 libs/base/Data/Primitives/Views.idr+49 libs/base/base.ipkg+1−1
idris.cabal+1−1
@@ -115,7 +115,7 @@ Extra-source-files:
115115 libs/base/Control/Monad/*.idr
116116 libs/base/Data/*.idr
117117 libs/base/Data/Nat/*.idr
118− libs/base/Data/Integer/*.idr
118+ libs/base/Data/Primitive/*.idr
119119 libs/base/Data/List/*.idr
120120 libs/base/Data/Vect/*.idr
121121 libs/base/Data/String/*.idr
libs/base/Data/Integer/Views.idrdeleted−19
@@ -1,19 +0,0 @@
1−module Data.Nat.Views
2−
3−||| View for expressing a number as a multiplication + a remainder
4−public export
5−data Divides : Integer -> (d : Integer) -> Type where
6− DivByZero : Divides x 0
7− DivBy : (prf : rem >= 0 && rem < d = True) ->
8− Divides ((d * div) + rem) d
9−
10−||| Covering function for the `Divides` view
11−export
12−divides : (val : Integer) -> (d : Integer) -> Divides val d
13−divides val 0 = DivByZero
14−divides val d
15− = let dividend = if d < 0 then -(val `div` abs d)
16− else val `div` d
17− remainder = val `mod` d in
18− believe_me (DivBy {d} {div = dividend} {rem = remainder}
19− (believe_me (Refl {x = True})))
libs/base/Data/Primitives/Views.idrnew file+49
@@ -0,0 +1,49 @@
1+module Data.Primitives.Views
2+
3+-- We need all the believe_mes and asserts throughout this file because we're
4+-- working with primitive here! We also have separate implementations per
5+-- primitive, rather than using interfaces, because we're only going to trust
6+-- the primitive implementations.
7+
8+namespace Integer
9+ ||| View for expressing a number as a multiplication + a remainder
10+ public export
11+ data Divides : Integer -> (d : Integer) -> Type where
12+ DivByZero : Divides x 0
13+ DivBy : (prf : rem >= 0 && rem < d = True) ->
14+ Divides ((d * div) + rem) d
15+
16+ ||| Covering function for the `Divides` view
17+ export
18+ divides : (val : Integer) -> (d : Integer) -> Divides val d
19+ divides val 0 = DivByZero
20+ divides val d
21+ = let dividend = if d < 0 then -(val `div` abs d)
22+ else val `div` d
23+ remainder = val `mod` d in
24+ believe_me (DivBy {d} {div = dividend} {rem = remainder}
25+ (believe_me (Refl {x = True})))
26+
27+namespace Int
28+ ||| View for expressing a number as a multiplication + a remainder
29+ public export
30+ data Divides : Int -> (d : Int) -> Type where
31+ DivByZero : Int.Divides x 0
32+ DivBy : (prf : rem >= 0 && rem < d = True) ->
33+ Int.Divides ((d * div) + rem) d
34+
35+ -- I have assumed, but not actually verified, that this will still
36+ -- give a right result (i.e. still adding up) when the Ints overflow.
37+ -- TODO: Someone please check this and fix if necessary...
38+
39+ ||| Covering function for the `Divides` view
40+ export
41+ divides : (val : Int) -> (d : Int) -> Divides val d
42+ divides val 0 = DivByZero
43+ divides val d
44+ = let dividend = if d < 0 then -(val `div` abs d)
45+ else val `div` d
46+ remainder = val `mod` d in
47+ believe_me (DivBy {d} {div = dividend} {rem = remainder}
48+ (believe_me (Refl {x = True})))
49+
libs/base/base.ipkg+1−1
@@ -19,7 +19,7 @@ modules = System,
1919 Data.Erased, Data.List, Data.List.Views,
2020 Data.List.Quantifiers,
2121 Data.Nat.Views,
22− Data.Integer.Views,
22+ Data.Primitives.Views,
2323 Data.String.Views,
2424 Data.So, Data.String,
2525