--------------------------------------------------------------------------------
-- Copyright © 2011 National Institute of Aerospace / Galois, Inc.
--------------------------------------------------------------------------------

-- |

module Copilot.Language.Operators.Extern
  ( extern
  , externW8
  , externW16
  , externW32
  , externW64
  , externI8
  , externI16
  , externI32
  , externI64
  , externF
  , externD
  , FunArg
  , externFun
  , externArray
  , funArg
  ) where

import Copilot.Core (Typed)
import Copilot.Language.Stream
import Data.Word
import Data.Int

--------------------------------------------------------------------------------

extern :: Typed a => String -> Stream a
extern = Extern

externFun :: Typed a => String -> [FunArg] -> Stream a
externFun = ExternFun

externArray :: (Typed a, Typed b, Integral a) => String -> Stream a -> Stream b
externArray = ExternArray

funArg :: Typed a => Stream a -> FunArg
funArg = FunArg

--------------------------------------------------------------------------------

externW8  :: String -> Stream Word8
externW8  = extern 
externW16 :: String -> Stream Word16
externW16 = extern
externW32 :: String -> Stream Word32
externW32 = extern
externW64 :: String -> Stream Word64
externW64 = extern
externI8  :: String -> Stream Int8
externI8  = extern
externI16 :: String -> Stream Int16
externI16 = extern
externI32 :: String -> Stream Int32
externI32 = extern
externI64 :: String -> Stream Int64
externI64 = extern
externF   :: String -> Stream Float
externF   = extern
externD   :: String -> Stream Double
externD   = extern