PrimSeq.agda 846 B

123456789101112131415161718192021222324252627282930313233343536
  1. module _ where
  2. open import Agda.Builtin.Nat using (mod-helper)
  3. open import Common.Prelude
  4. open import Common.Equality
  5. _mod_ : Nat → Nat → Nat
  6. n mod zero = 0
  7. n mod suc m = mod-helper 0 m n m
  8. {-# INLINE _mod_ #-}
  9. primitive
  10. primForce : ∀ {a b} {A : Set a} {B : A → Set b} (x : A) → (∀ x → B x) → B x
  11. primForceLemma : ∀ {a b} {A : Set a} {B : A → Set b} (x : A) (f : ∀ x → B x) → primForce x f ≡ f x
  12. force = primForce
  13. forceLemma = primForceLemma
  14. infixr 0 _$!_
  15. _$!_ : ∀ {a b} {A : Set a} {B : A → Set b} → (∀ x → B x) → ∀ x → B x
  16. f $! x = force x f
  17. -- Memory leak without proper seq --
  18. pow′ : Nat → Nat → Nat
  19. pow′ zero acc = acc
  20. pow′ (suc n) acc = pow′ n $! (acc + acc) mod 234576373
  21. pow : Nat → Nat
  22. pow n = pow′ n 1
  23. main : IO Unit
  24. main = printNat (pow 5000000)