{-# LANGUAGE ConstraintKinds #-}

module JVM.Data.Convert.Monad where

import Data.Word (Word16)
import Effectful
import Effectful.Error.Static
import JVM.Data.Abstract.Builder.Label
import JVM.Data.Convert.ConstantPool (ConstantPool, ConstantPoolState, runConstantPool)

type ConvertEff r = (ConstantPool :> r, Error CodeConverterError :> r)

runConvertM :: Eff (ConstantPool : Error CodeConverterError : r) a -> Eff r (Either CodeConverterError (a, ConstantPoolState))
runConvertM :: forall (r :: [(* -> *) -> * -> *]) a.
Eff (ConstantPool : Error CodeConverterError : r) a
-> Eff r (Either CodeConverterError (a, ConstantPoolState))
runConvertM = (Either (CallStack, CodeConverterError) (a, ConstantPoolState)
 -> Either CodeConverterError (a, ConstantPoolState))
-> Eff
     r (Either (CallStack, CodeConverterError) (a, ConstantPoolState))
-> Eff r (Either CodeConverterError (a, ConstantPoolState))
forall a b. (a -> b) -> Eff r a -> Eff r b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Either (CallStack, CodeConverterError) (a, ConstantPoolState)
-> Either CodeConverterError (a, ConstantPoolState)
forall {a} {a} {b}. Either (a, a) b -> Either a b
mapLeft (Eff
   r (Either (CallStack, CodeConverterError) (a, ConstantPoolState))
 -> Eff r (Either CodeConverterError (a, ConstantPoolState)))
-> (Eff (ConstantPool : Error CodeConverterError : r) a
    -> Eff
         r (Either (CallStack, CodeConverterError) (a, ConstantPoolState)))
-> Eff (ConstantPool : Error CodeConverterError : r) a
-> Eff r (Either CodeConverterError (a, ConstantPoolState))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Eff (Error CodeConverterError : r) (a, ConstantPoolState)
-> Eff
     r (Either (CallStack, CodeConverterError) (a, ConstantPoolState))
forall e (es :: [(* -> *) -> * -> *]) a.
HasCallStack =>
Eff (Error e : es) a -> Eff es (Either (CallStack, e) a)
runError (Eff (Error CodeConverterError : r) (a, ConstantPoolState)
 -> Eff
      r (Either (CallStack, CodeConverterError) (a, ConstantPoolState)))
-> (Eff (ConstantPool : Error CodeConverterError : r) a
    -> Eff (Error CodeConverterError : r) (a, ConstantPoolState))
-> Eff (ConstantPool : Error CodeConverterError : r) a
-> Eff
     r (Either (CallStack, CodeConverterError) (a, ConstantPoolState))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Eff (ConstantPool : Error CodeConverterError : r) a
-> Eff (Error CodeConverterError : r) (a, ConstantPoolState)
forall (r :: [(* -> *) -> * -> *]) a.
Eff (ConstantPool : r) a -> Eff r (a, ConstantPoolState)
runConstantPool
  where
    mapLeft :: Either (a, a) b -> Either a b
mapLeft (Left (a
_, a
e)) = a -> Either a b
forall a b. a -> Either a b
Left a
e
    mapLeft (Right b
b) = b -> Either a b
forall a b. b -> Either a b
Right b
b

data CodeConverterError
    = DuplicateLabel Label Word16
    | UnmarkedLabel Label
    deriving (Int -> CodeConverterError -> ShowS
[CodeConverterError] -> ShowS
CodeConverterError -> String
(Int -> CodeConverterError -> ShowS)
-> (CodeConverterError -> String)
-> ([CodeConverterError] -> ShowS)
-> Show CodeConverterError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CodeConverterError -> ShowS
showsPrec :: Int -> CodeConverterError -> ShowS
$cshow :: CodeConverterError -> String
show :: CodeConverterError -> String
$cshowList :: [CodeConverterError] -> ShowS
showList :: [CodeConverterError] -> ShowS
Show)