-- | read benchmark from in-memory data (e.g., from a ByteString)

module TPDB.Input.Memory

where

import TPDB.Data
import TPDB.Plain.Read
import TPDB.XTC.Read

import qualified Data.Text.Lazy as T
import System.FilePath.Posix ( takeExtension )

-- | first argument is file name, second argument is file contents.
-- first arg. is needed to pick the proper parser (SRS, TRS, XTC)
get :: String -> T.Text
    -> IO (Either String (Either (TRS Identifier Identifier) (SRS Identifier)))
get :: String
-> Text
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
get String
f Text
s = case String -> String
takeExtension String
f of
      String
".srs" -> do
          case Text -> Either String (SRS Identifier)
srs Text
s of
              Left String
err -> Either String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either
   String (Either (TRS Identifier Identifier) (SRS Identifier))
 -> IO
      (Either
         String (Either (TRS Identifier Identifier) (SRS Identifier))))
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall a b. (a -> b) -> a -> b
$ String
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
forall a b. a -> Either a b
Left String
err
              Right SRS Identifier
t -> Either String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either
   String (Either (TRS Identifier Identifier) (SRS Identifier))
 -> IO
      (Either
         String (Either (TRS Identifier Identifier) (SRS Identifier))))
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall a b. (a -> b) -> a -> b
$ Either (TRS Identifier Identifier) (SRS Identifier)
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
forall a b. b -> Either a b
Right (Either (TRS Identifier Identifier) (SRS Identifier)
 -> Either
      String (Either (TRS Identifier Identifier) (SRS Identifier)))
-> Either (TRS Identifier Identifier) (SRS Identifier)
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
forall a b. (a -> b) -> a -> b
$ SRS Identifier
-> Either (TRS Identifier Identifier) (SRS Identifier)
forall a b. b -> Either a b
Right SRS Identifier
t
      String
".trs" -> do        
          case Text -> Either String (TRS Identifier Identifier)
TPDB.Plain.Read.trs Text
s of
              Left String
err -> Either String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either
   String (Either (TRS Identifier Identifier) (SRS Identifier))
 -> IO
      (Either
         String (Either (TRS Identifier Identifier) (SRS Identifier))))
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall a b. (a -> b) -> a -> b
$ String
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
forall a b. a -> Either a b
Left String
err
              Right TRS Identifier Identifier
t -> Either String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either
   String (Either (TRS Identifier Identifier) (SRS Identifier))
 -> IO
      (Either
         String (Either (TRS Identifier Identifier) (SRS Identifier))))
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall a b. (a -> b) -> a -> b
$ Either (TRS Identifier Identifier) (SRS Identifier)
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
forall a b. b -> Either a b
Right (Either (TRS Identifier Identifier) (SRS Identifier)
 -> Either
      String (Either (TRS Identifier Identifier) (SRS Identifier)))
-> Either (TRS Identifier Identifier) (SRS Identifier)
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
forall a b. (a -> b) -> a -> b
$ TRS Identifier Identifier
-> Either (TRS Identifier Identifier) (SRS Identifier)
forall a b. a -> Either a b
Left TRS Identifier Identifier
t 
      String
_ -> do
          case Text -> Either SomeException (Problem Identifier Identifier)
readProblemT Text
s of
             Right Problem Identifier Identifier
p -> Either String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either
   String (Either (TRS Identifier Identifier) (SRS Identifier))
 -> IO
      (Either
         String (Either (TRS Identifier Identifier) (SRS Identifier))))
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
-> IO
     (Either
        String (Either (TRS Identifier Identifier) (SRS Identifier)))
forall a b. (a -> b) -> a -> b
$ Either (TRS Identifier Identifier) (SRS Identifier)
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
forall a b. b -> Either a b
Right (Either (TRS Identifier Identifier) (SRS Identifier)
 -> Either
      String (Either (TRS Identifier Identifier) (SRS Identifier)))
-> Either (TRS Identifier Identifier) (SRS Identifier)
-> Either
     String (Either (TRS Identifier Identifier) (SRS Identifier))
forall a b. (a -> b) -> a -> b
$ TRS Identifier Identifier
-> Either (TRS Identifier Identifier) (SRS Identifier)
forall a b. a -> Either a b
Left (TRS Identifier Identifier
 -> Either (TRS Identifier Identifier) (SRS Identifier))
-> TRS Identifier Identifier
-> Either (TRS Identifier Identifier) (SRS Identifier)
forall a b. (a -> b) -> a -> b
$ Problem Identifier Identifier -> TRS Identifier Identifier
forall v s. Problem v s -> TRS v s
TPDB.Data.trs Problem Identifier Identifier
p