Add Bool/
This commit is contained in:
parent
2a472680d9
commit
1883716525
14 changed files with 197 additions and 0 deletions
14
Bool/and.dhall
Normal file
14
Bool/and.dhall
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{-|
|
||||||
|
The `and` function returns `False` if there are any `False` elements in the
|
||||||
|
`List` and returns `True` otherwise
|
||||||
|
-}
|
||||||
|
let and
|
||||||
|
: List Bool → Bool
|
||||||
|
= λ(xs : List Bool) →
|
||||||
|
List/fold Bool xs Bool (λ(l : Bool) → λ(r : Bool) → l && r) True
|
||||||
|
|
||||||
|
let example0 = assert : and [ True, False, True ] ≡ False
|
||||||
|
|
||||||
|
let example1 = assert : and ([] : List Bool) ≡ True
|
||||||
|
|
||||||
|
in and
|
16
Bool/build.dhall
Normal file
16
Bool/build.dhall
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
--| `build` is the inverse of `fold`
|
||||||
|
let build
|
||||||
|
: (∀(bool : Type) → ∀(true : bool) → ∀(false : bool) → bool) → Bool
|
||||||
|
= λ(f : ∀(bool : Type) → ∀(true : bool) → ∀(false : bool) → bool) →
|
||||||
|
f Bool True False
|
||||||
|
|
||||||
|
let example0 =
|
||||||
|
assert
|
||||||
|
: build (λ(bool : Type) → λ(true : bool) → λ(false : bool) → true) ≡ True
|
||||||
|
|
||||||
|
let example1 =
|
||||||
|
assert
|
||||||
|
: build (λ(bool : Type) → λ(true : bool) → λ(false : bool) → false)
|
||||||
|
≡ False
|
||||||
|
|
||||||
|
in build
|
20
Bool/even.dhall
Normal file
20
Bool/even.dhall
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{-|
|
||||||
|
Returns `True` if there are an even number of `False` elements in the list and
|
||||||
|
returns `False` otherwise.
|
||||||
|
|
||||||
|
This function is the `Monoid` for the `==` operation.
|
||||||
|
-}
|
||||||
|
let even
|
||||||
|
: List Bool → Bool
|
||||||
|
= λ(xs : List Bool) →
|
||||||
|
List/fold Bool xs Bool (λ(x : Bool) → λ(y : Bool) → x == y) True
|
||||||
|
|
||||||
|
let example0 = assert : even [ False, True, False ] ≡ True
|
||||||
|
|
||||||
|
let example1 = assert : even [ False, True ] ≡ False
|
||||||
|
|
||||||
|
let example2 = assert : even [ False ] ≡ False
|
||||||
|
|
||||||
|
let example3 = assert : even ([] : List Bool) ≡ True
|
||||||
|
|
||||||
|
in even
|
14
Bool/fold.dhall
Normal file
14
Bool/fold.dhall
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
--| `fold` is essentially the same as `if`/`then`/`else` except as a function
|
||||||
|
let fold
|
||||||
|
: ∀(b : Bool) → ∀(bool : Type) → ∀(true : bool) → ∀(false : bool) → bool
|
||||||
|
= λ(b : Bool) →
|
||||||
|
λ(bool : Type) →
|
||||||
|
λ(true : bool) →
|
||||||
|
λ(false : bool) →
|
||||||
|
if b then true else false
|
||||||
|
|
||||||
|
let example0 = assert : fold True Natural 0 1 ≡ 0
|
||||||
|
|
||||||
|
let example1 = assert : fold False Natural 0 1 ≡ 1
|
||||||
|
|
||||||
|
in fold
|
11
Bool/fromAny.dhall
Normal file
11
Bool/fromAny.dhall
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
λ(nix : ../NixPrelude.dhall) →
|
||||||
|
let Any = ../Any/Type.dhall
|
||||||
|
|
||||||
|
let Any/toTypeUnchecked = ../Any/toTypeUnchecked.dhall nix
|
||||||
|
|
||||||
|
let Misc/throw = ../Misc/throw.dhall nix
|
||||||
|
|
||||||
|
in λ(v : Any) →
|
||||||
|
if nix.builtins.isBool v
|
||||||
|
then Any/toTypeUnchecked Bool v
|
||||||
|
else Misc/throw Bool "Failed to coerce object into Bool"
|
10
Bool/not.dhall
Normal file
10
Bool/not.dhall
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
--| Flip the value of a `Bool`
|
||||||
|
let not
|
||||||
|
: Bool → Bool
|
||||||
|
= λ(b : Bool) → b == False
|
||||||
|
|
||||||
|
let example0 = assert : not True ≡ False
|
||||||
|
|
||||||
|
let example1 = assert : not False ≡ True
|
||||||
|
|
||||||
|
in not
|
20
Bool/odd.dhall
Normal file
20
Bool/odd.dhall
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{-|
|
||||||
|
Returns `True` if there are an odd number of `True` elements in the list and
|
||||||
|
returns `False` otherwise.
|
||||||
|
|
||||||
|
This function is the `Monoid` for the `!=` operation.
|
||||||
|
-}
|
||||||
|
let odd
|
||||||
|
: List Bool → Bool
|
||||||
|
= λ(xs : List Bool) →
|
||||||
|
List/fold Bool xs Bool (λ(x : Bool) → λ(y : Bool) → x != y) False
|
||||||
|
|
||||||
|
let example0 = assert : odd [ True, False, True ] ≡ False
|
||||||
|
|
||||||
|
let example1 = assert : odd [ True, False ] ≡ True
|
||||||
|
|
||||||
|
let example2 = assert : odd [ True ] ≡ True
|
||||||
|
|
||||||
|
let example3 = assert : odd ([] : List Bool) ≡ False
|
||||||
|
|
||||||
|
in odd
|
14
Bool/or.dhall
Normal file
14
Bool/or.dhall
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{-|
|
||||||
|
The `or` function returns `True` if there are any `True` elements in the `List`
|
||||||
|
and returns `False` otherwise
|
||||||
|
-}
|
||||||
|
let or
|
||||||
|
: List Bool → Bool
|
||||||
|
= λ(xs : List Bool) →
|
||||||
|
List/fold Bool xs Bool (λ(l : Bool) → λ(r : Bool) → l || r) False
|
||||||
|
|
||||||
|
let example0 = assert : or [ True, False, True ] ≡ True
|
||||||
|
|
||||||
|
let example1 = assert : or ([] : List Bool) ≡ False
|
||||||
|
|
||||||
|
in or
|
12
Bool/package.dhall
Normal file
12
Bool/package.dhall
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
λ(nix : ../NixPrelude.dhall) →
|
||||||
|
{ Type = Bool
|
||||||
|
, and = ./and.dhall
|
||||||
|
, build = ./build.dhall
|
||||||
|
, even = ./even.dhall
|
||||||
|
, fold = ./fold.dhall
|
||||||
|
, fromAny = ./fromAny.dhall nix
|
||||||
|
, not = ./not.dhall
|
||||||
|
, odd = ./odd.dhall
|
||||||
|
, or = ./or.dhall
|
||||||
|
, show = ./show.dhall
|
||||||
|
}
|
13
Bool/show.dhall
Normal file
13
Bool/show.dhall
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{-|
|
||||||
|
Render a `Bool` as `Text` using the same representation as Dhall source code
|
||||||
|
(i.e. beginning with a capital letter)
|
||||||
|
-}
|
||||||
|
let show
|
||||||
|
: Bool → Text
|
||||||
|
= λ(b : Bool) → if b then "True" else "False"
|
||||||
|
|
||||||
|
let example0 = assert : show True ≡ "True"
|
||||||
|
|
||||||
|
let example1 = assert : show False ≡ "False"
|
||||||
|
|
||||||
|
in show
|
1
Misc/package.dhall
Normal file
1
Misc/package.dhall
Normal file
|
@ -0,0 +1 @@
|
||||||
|
λ(nix : ../NixPrelude.dhall) → { throw = ./throw.dhall nix }
|
6
Misc/throw.dhall
Normal file
6
Misc/throw.dhall
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
λ(nix : ../NixPrelude.dhall) →
|
||||||
|
let Any/toTypeUnchecked = ../Any/toTypeUnchecked.dhall nix
|
||||||
|
|
||||||
|
in λ(t : Type) →
|
||||||
|
λ(message : Text) →
|
||||||
|
Any/toTypeUnchecked t (nix.builtins.throw message)
|
43
Monoid.dhall
Normal file
43
Monoid.dhall
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
{-|
|
||||||
|
Any function `f` that is a `Monoid` must satisfy the following law:
|
||||||
|
|
||||||
|
```
|
||||||
|
t : Type
|
||||||
|
f : ./Monoid t
|
||||||
|
xs : List (List t)
|
||||||
|
|
||||||
|
f (./List/concat t xs) = f (./map (List t) t f xs)
|
||||||
|
```
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```
|
||||||
|
./Bool/and
|
||||||
|
: ./Monoid Bool
|
||||||
|
./Bool/or
|
||||||
|
: ./Monoid Bool
|
||||||
|
./Bool/even
|
||||||
|
: ./Monoid Bool
|
||||||
|
./Bool/odd
|
||||||
|
: ./Monoid Bool
|
||||||
|
./List/concat
|
||||||
|
: ∀(a : Type) → ./Monoid (List a)
|
||||||
|
./List/shifted
|
||||||
|
: ∀(a : Type) → ./Monoid (List { index : Natural, value : a })
|
||||||
|
./Natural/sum
|
||||||
|
: ./Monoid Natural
|
||||||
|
./Natural/product
|
||||||
|
: ./Monoid Natural
|
||||||
|
./Optional/head
|
||||||
|
: ∀(a : Type) → ./Monoid (Optional a)
|
||||||
|
./Optional/last
|
||||||
|
: ∀(a : Type) → ./Monoid (Optional a)
|
||||||
|
./Text/concat
|
||||||
|
: ./Monoid Text
|
||||||
|
```
|
||||||
|
-}
|
||||||
|
let Monoid
|
||||||
|
: ∀(m : Type) → Type
|
||||||
|
= λ(m : Type) → List m → m
|
||||||
|
|
||||||
|
in Monoid
|
|
@ -1,5 +1,8 @@
|
||||||
λ(nix : ./NixPrelude.dhall) →
|
λ(nix : ./NixPrelude.dhall) →
|
||||||
{ Any = ./Any/package.dhall nix
|
{ Any = ./Any/package.dhall nix
|
||||||
|
, Bool = ./Bool/package.dhall nix
|
||||||
|
, Misc = ./Misc/package.dhall nix
|
||||||
|
, Monoid = ./Monoid.dhall
|
||||||
, Number = ./Number/package.dhall nix
|
, Number = ./Number/package.dhall nix
|
||||||
, Path = ./Path/package.dhall nix
|
, Path = ./Path/package.dhall nix
|
||||||
, Set = ./Set/package.dhall nix
|
, Set = ./Set/package.dhall nix
|
||||||
|
|
Loading…
Reference in a new issue