{-# LINE 1 "src/Foreign/R/Parse.hsc" #-}
-- |
-- Copyright: (C) 2013 Amgen, Inc.
--
-- Bindings for @<R/R_ext/Parse.h>@.

{-# LANGUAGE CPP #-}
{-# LANGUAGE CApiFFI #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ForeignFunctionInterface #-}



module Foreign.R.Parse
  ( parseVector
  , ParseStatus(..)
  ) where

import Foreign.R.Constraints
import qualified Foreign.R as R

import Foreign
import Foreign.C

-- | The return code of a call to 'parseVector', indicating whether the parser
-- failed or succeeded.
data ParseStatus
  = PARSE_NULL
  | PARSE_OK
  | PARSE_INCOMPLETE
  | PARSE_ERROR
  | PARSE_EOF
  deriving (ParseStatus -> ParseStatus -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParseStatus -> ParseStatus -> Bool
$c/= :: ParseStatus -> ParseStatus -> Bool
== :: ParseStatus -> ParseStatus -> Bool
$c== :: ParseStatus -> ParseStatus -> Bool
Eq, Int -> ParseStatus -> ShowS
[ParseStatus] -> ShowS
ParseStatus -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParseStatus] -> ShowS
$cshowList :: [ParseStatus] -> ShowS
show :: ParseStatus -> String
$cshow :: ParseStatus -> String
showsPrec :: Int -> ParseStatus -> ShowS
$cshowsPrec :: Int -> ParseStatus -> ShowS
Show)

instance Enum ParseStatus where
  fromEnum :: ParseStatus -> Int
fromEnum ParseStatus
PARSE_NULL       = Int
0
{-# LINE 38 "src/Foreign/R/Parse.hsc" #-}
  fromEnum PARSE_OK         = 1
{-# LINE 39 "src/Foreign/R/Parse.hsc" #-}
  fromEnum PARSE_INCOMPLETE = 2
{-# LINE 40 "src/Foreign/R/Parse.hsc" #-}
  fromEnum PARSE_ERROR      = 3
{-# LINE 41 "src/Foreign/R/Parse.hsc" #-}
  fromEnum PARSE_EOF        = 4
{-# LINE 42 "src/Foreign/R/Parse.hsc" #-}
  toEnum i = case i of
    (0)       -> PARSE_NULL
{-# LINE 44 "src/Foreign/R/Parse.hsc" #-}
    (1)         -> PARSE_OK
{-# LINE 45 "src/Foreign/R/Parse.hsc" #-}
    (2) -> PARSE_INCOMPLETE
{-# LINE 46 "src/Foreign/R/Parse.hsc" #-}
    (3)      -> PARSE_ERROR
{-# LINE 47 "src/Foreign/R/Parse.hsc" #-}
    (4)        -> PARSE_EOF
{-# LINE 48 "src/Foreign/R/Parse.hsc" #-}
    _ -> error "ParseStatus.fromEnum: can't mach value"

-- | @parseVector text num status source@ parses the input string into an AST.
-- @source@, if provided, names the origin of @text@ (e.g. a filename). @num@
-- limits the number of expressions to parse, or @-1@ if no limit.

-- TODO: use ParseStatus or write a wrapper for parseVector.
parseVector
  :: (In a [R.Nil, R.String])
  => R.SEXP s R.String
  -> Int
  -> Ptr CInt
  -> R.SEXP s a
  -> IO (R.SEXP s R.Expr)
parseVector :: forall (a :: SEXPTYPE) s.
In a '[ 'Nil, 'String] =>
SEXP s 'String -> Int -> Ptr CInt -> SEXP s a -> IO (SEXP s 'Expr)
parseVector (forall s (a :: SEXPTYPE). SEXP s a -> SEXP0
R.unsexp -> SEXP0
s) (forall a b. (Integral a, Num b) => a -> b
fromIntegral -> CInt
cnt) Ptr CInt
reti (forall s (a :: SEXPTYPE). SEXP s a -> SEXP0
R.unsexp -> SEXP0
input) =
  forall s (a :: SEXPTYPE). SEXP0 -> SEXP s a
R.sexp forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SEXP0 -> CInt -> Ptr CInt -> SEXP0 -> IO SEXP0
c_parseVector SEXP0
s CInt
cnt Ptr CInt
reti SEXP0
input
 
foreign import ccall "R_ext/Parse.h R_ParseVector" c_parseVector
  :: R.SEXP0 -> CInt -> Ptr CInt -> R.SEXP0 -> IO R.SEXP0