{-|
Copyright  :  (C) 2015-2016, University of Twente
License    :  BSD2 (see the file LICENSE)
Maintainer :  Christiaan Baaij <christiaan.baaij@gmail.com>
-}

{-# LANGUAGE Unsafe #-}

module Clash.Promoted.Nat.Unsafe
  (unsafeSNat)
where

import Data.Reflection    (reifyNat)
import Unsafe.Coerce      (unsafeCoerce)

import Clash.Promoted.Nat (SNat, snatProxy)

-- | I hope you know what you're doing
unsafeSNat :: Integer -> SNat k
unsafeSNat :: Integer -> SNat k
unsafeSNat Integer
i = Integer
-> (forall (n :: Nat). KnownNat n => Proxy n -> SNat k) -> SNat k
forall r.
Integer -> (forall (n :: Nat). KnownNat n => Proxy n -> r) -> r
reifyNat Integer
i ((forall (n :: Nat). KnownNat n => Proxy n -> SNat k) -> SNat k)
-> (forall (n :: Nat). KnownNat n => Proxy n -> SNat k) -> SNat k
forall a b. (a -> b) -> a -> b
$ (\Proxy n
p -> SNat n -> SNat k
forall a b. a -> b
unsafeCoerce (Proxy n -> SNat n
forall (n :: Nat) (proxy :: Nat -> Type).
KnownNat n =>
proxy n -> SNat n
snatProxy Proxy n
p))
{-# NOINLINE unsafeSNat #-}