Library additions from AoC
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
"patterns": [
|
"patterns": [
|
||||||
{
|
{
|
||||||
"name": "invalid.illegal.trace",
|
"name": "invalid.illegal.trace",
|
||||||
"match": "\\b(trace|fatalError)\\b"
|
"match": "\\b(trace|strace|fatalError)\\b"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "comment.block.newt",
|
"name": "comment.block.newt",
|
||||||
|
|||||||
34
src/Data/Fin.newt
Normal file
34
src/Data/Fin.newt
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
module Data.Fin
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
-- TODO - handle erased params in Nat transform.
|
||||||
|
-- TODO - double check we erase params to type constructors
|
||||||
|
data Fin : Nat → U where
|
||||||
|
FZ : ∀ k. Fin (S k)
|
||||||
|
FS : ∀ k. Fin k → Fin (S k)
|
||||||
|
|
||||||
|
allFins : (n : Nat) → List (Fin n)
|
||||||
|
allFins Z = Nil
|
||||||
|
allFins (S k) = FZ :: map FS (allFins k)
|
||||||
|
|
||||||
|
-- TODO maybe teach compiler to recognize and make magic Nat Eq fast?
|
||||||
|
instance ∀ n. Eq (Fin n) where
|
||||||
|
FZ == FZ = True
|
||||||
|
FS l == FS n = l == n
|
||||||
|
_ == _ = False
|
||||||
|
|
||||||
|
-- TODO - recognize identity functions
|
||||||
|
weaken : ∀ k. Fin k → Fin (S k)
|
||||||
|
weaken FZ = FZ
|
||||||
|
weaken (FS k) = FS $ weaken k
|
||||||
|
|
||||||
|
instance ∀ n. Cast (Fin n) Nat where
|
||||||
|
cast FZ = Z
|
||||||
|
cast (FS x) = S (cast x)
|
||||||
|
|
||||||
|
instance ∀ k. Show (Fin k) where
|
||||||
|
show x = show {Nat} $ cast x
|
||||||
|
|
||||||
|
lastFin : {n : _} -> Fin (S n)
|
||||||
|
lastFin {Z} = FZ
|
||||||
|
lastFin {S _} = FS lastFin
|
||||||
52
src/Data/Vect.newt
Normal file
52
src/Data/Vect.newt
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
module Data.Vect
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
import Data.Fin
|
||||||
|
|
||||||
|
infixr 6 _:-_
|
||||||
|
data Vect : (0 n : Nat) → (0 a : U) → U where
|
||||||
|
VNil : ∀ a. Vect Z a
|
||||||
|
_:-_ : ∀ k a. a → Vect k a → Vect (S k) a
|
||||||
|
|
||||||
|
vindex : ∀ n a. Fin n → Vect n a → a
|
||||||
|
vindex FZ (x :- _) = x
|
||||||
|
vindex (FS k) (x :- rest) = vindex k rest
|
||||||
|
vindex () VNil -- Idris doesn't need this hint.
|
||||||
|
|
||||||
|
instance ∀ k. Functor (Vect k) where
|
||||||
|
map f VNil = VNil
|
||||||
|
map f (x :- xs) = f x :- map f xs
|
||||||
|
|
||||||
|
toVect : ∀ a. (n : Nat) -> List a -> Maybe (Vect n a)
|
||||||
|
toVect (S k) (x :: xs) = _:-_ x <$> toVect k xs
|
||||||
|
toVect Z Nil = Just VNil
|
||||||
|
toVect _ _ = Nothing
|
||||||
|
|
||||||
|
instance ∀ n a. Cast (Vect n a) (List a) where
|
||||||
|
cast VNil = Nil
|
||||||
|
cast (x :- xs) = x :: cast xs
|
||||||
|
|
||||||
|
instance ∀ n a. {{Show a}} → Show (Vect n a) where
|
||||||
|
show {n} {a} xs = show $ cast {_} {List a} xs
|
||||||
|
|
||||||
|
vIndexes : (n : Nat) → Vect n (Fin n)
|
||||||
|
vIndexes Z = VNil
|
||||||
|
vIndexes (S k) = FZ :- map FS (vIndexes k)
|
||||||
|
|
||||||
|
vIndexes' : ∀ n a. Vect n a → Vect n (Fin n)
|
||||||
|
vIndexes' VNil = VNil
|
||||||
|
vIndexes' ( _ :- xs) = FZ :- map FS (vIndexes' xs)
|
||||||
|
|
||||||
|
venum : ∀ n a. Vect n a → Vect n (Fin n × a)
|
||||||
|
venum VNil = VNil
|
||||||
|
venum (x :- xs) = (FZ, x) :- map (mapFst FS) (venum xs)
|
||||||
|
|
||||||
|
zipVect : ∀ n a b. Vect n a → Vect n b → Vect n (a × b)
|
||||||
|
zipVect VNil VNil = VNil
|
||||||
|
zipVect (x :- xs) (y :- ys) = (x,y) :- zipVect xs ys
|
||||||
|
|
||||||
|
vset : ∀ n a. Fin n → a → Vect n a → Vect n a
|
||||||
|
vset () el VNil
|
||||||
|
vset FZ el (x :- xs) = el :- xs
|
||||||
|
vset (FS k) el (x :- xs) = x :- vset k el xs
|
||||||
|
|
||||||
@@ -607,8 +607,15 @@ elem v (x :: xs) = if v == x then True else elem v xs
|
|||||||
-- TODO no empty value on my `Add`, I need a group..
|
-- TODO no empty value on my `Add`, I need a group..
|
||||||
-- sum : ∀ a. {{Add a}} → List a → a
|
-- sum : ∀ a. {{Add a}} → List a → a
|
||||||
-- sum xs = foldl _+_
|
-- sum xs = foldl _+_
|
||||||
|
|
||||||
|
-- TODO debugStr is not super useful any more.
|
||||||
pfunc trace uses (debugStr) : ∀ a. String → a → a := `(_, msg, a) => { console.log(msg,Prelude_debugStr(_,a)); return a }`
|
pfunc trace uses (debugStr) : ∀ a. String → a → a := `(_, msg, a) => { console.log(msg,Prelude_debugStr(_,a)); return a }`
|
||||||
|
|
||||||
|
pfunc prim_strace : String → String → String := `(msg, a) => { console.log(msg,a); return a }`
|
||||||
|
|
||||||
|
strace : ∀ a. {{Show a}} → String → a → a
|
||||||
|
strace msg a = let x = prim_strace msg (show a) in a
|
||||||
|
|
||||||
mapMaybe : ∀ a b. (a → Maybe b) → List a → List b
|
mapMaybe : ∀ a b. (a → Maybe b) → List a → List b
|
||||||
mapMaybe {a} {b} f xs = go Lin xs
|
mapMaybe {a} {b} f xs = go Lin xs
|
||||||
where
|
where
|
||||||
@@ -695,6 +702,11 @@ isNothing : ∀ a. Maybe a → Bool
|
|||||||
isNothing Nothing = True
|
isNothing Nothing = True
|
||||||
isNothing _ = False
|
isNothing _ = False
|
||||||
|
|
||||||
|
isJust : ∀ a. Maybe a → Bool
|
||||||
|
isJust Nothing = False
|
||||||
|
isJust _ = True
|
||||||
|
|
||||||
|
|
||||||
instance Bifunctor _×_ where
|
instance Bifunctor _×_ where
|
||||||
bimap f g (a,b) = (f a, g b)
|
bimap f g (a,b) = (f a, g b)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user