module linear.Main where
open import Level
open import linear.Surface.Surface
open import linear.Data.ByteString
open import Data.String
open import Data.List as List hiding (_++_)
open import Function
open import Coinduction
open import IO
open import Data.Maybe as Maybe
open import linear.Type
data Pair {ℓ₁ ℓ₂} (A : Set ℓ₁) (B : Set ℓ₂) : Set (ℓ₁ ⊔ ℓ₂) where
_,_ : A → B → Pair A B
{-# FOREIGN GHC type AgdaPair l1 l2 a b = (a,b) #-}
{-# COMPILE GHC Pair = data MAlonzo.Code.Qlinear.Main.AgdaPair ((,)) #-}
Pairmap : ∀ {a b c d} {A : Set a} {B : Set b} {C : Set c} {D : Set d} →
(A → C) → (B → D) → Pair A B → Pair C D
Pairmap f g (a , b) = f a , g b
uncurry : ∀ {ℓ₁ ℓ₂ ℓ₃} {A : Set ℓ₁} {B : Set ℓ₂} {C : Set ℓ₃} →
(A → B → C) → (Pair A B → C)
uncurry f (a , b) = f a b
postulate
RparseProblems : RByteString → Maybe (List (Pair RType RCheck))
{-# FOREIGN GHC import qualified Data.ByteString #-}
{-# FOREIGN GHC import qualified Type.Parser #-}
{-# FOREIGN GHC import qualified Surface.Parser #-}
{-# COMPILE GHC RparseProblems = Surface.Parser.parseProblems #-}
parseProblems : ByteString → Maybe (List (Pair Type Check))
parseProblems bs = Maybe.map (List.map (Pairmap embed^RType embed^RCheck)) $ RparseProblems bs
infixr 5 _¡[_]_
_¡[_]_ : ∀ {ℓ} {A : Set ℓ} → Maybe A → String → (A → _) → _
ma ¡[ str ] f = maybe f (♯ putStrLn ("Fail: " ++ str)) ma
main =
run $ ♯ lift (readFileBS "input.lin") >>= λ bs →
parseProblems bs ¡[ "parse" ] foldr (uncurry λ σ c io →
♯ ((linear σ c ¡[ "check" ] λ _ → ♯ putStrLn "Success") >> io)) (♯ return _)