0 | module Statistics.Distribution.GSL
2 | import public Data.Vect
6 | data GslRng : Type where
7 | MkGslRng : AnyPtr -> GslRng
10 | %foreign "C:init_gsl_rng,distribution"
11 | init_gsl_rng_c : AnyPtr
14 | init_gsl_rng : GslRng
15 | init_gsl_rng = MkGslRng init_gsl_rng_c
18 | %foreign "C:init_array, distribution"
19 | init_array_c : (n : Int) -> AnyPtr
22 | init_array : (n : Nat) -> AnyPtr
23 | init_array = init_array_c . cast
26 | %foreign "C:assign_array, distribution"
27 | assign_array_c : (base_ptr : AnyPtr) -> (idx : Int) -> (val : Double) -> AnyPtr
30 | %foreign "C:print_array, distribution"
31 | print_array_c : (base_ptr : AnyPtr) -> (n : Int) -> PrimIO ()
34 | %foreign "C:index_array, distribution"
35 | index_array_c : (base_ptr : AnyPtr) -> (idx : Int) -> Double
38 | rangeTo : (n : Nat) -> Vect n Nat
40 | rangeTo (S n) = snoc (rangeTo n) (n)
44 | to_array : {n : Nat} -> Vect (S n) Double -> AnyPtr
46 | let ptr = init_array_c (cast (S n))
47 | f : Vect (S n) AnyPtr = map (\(x, idx) => assign_array_c ptr (cast idx) x ) (zip xs (rangeTo (S n)))
52 | from_array : {n : Nat} -> AnyPtr -> Vect (S n) Double
54 | map (\idx => index_array_c ptr (cast idx)) (rangeTo (S n))
59 | let p = to_array [0, 1, 2, 3]
60 | primIO (print_array_c p 4)