{- |
    Module      : $Header$
    Description : Representation of annotated FlatCurry.
    Copyright   : (c) 2016 - 2017 Finn Teegen
    License     : BSD-3-clause

    Maintainer  : fte@informatik.uni-kiel.de
    Stability   : experimental
    Portability : portable

    TODO
-}

module Curry.FlatCurry.Annotated.Type
  ( module Curry.FlatCurry.Annotated.Type
  , module Curry.FlatCurry.Typeable
  , module Curry.FlatCurry.Type
  ) where

import Curry.FlatCurry.Typeable
import Curry.FlatCurry.Type ( QName, VarIndex, Visibility (..), TVarIndex
                            , TypeDecl (..), OpDecl (..), Fixity (..)
                            , TypeExpr (..), ConsDecl (..)
                            , Literal (..), CombType (..), CaseType (..)
                            )

data AProg a = AProg String [String] [TypeDecl] [AFuncDecl a] [OpDecl]
  deriving (AProg a -> AProg a -> Bool
(AProg a -> AProg a -> Bool)
-> (AProg a -> AProg a -> Bool) -> Eq (AProg a)
forall a. Eq a => AProg a -> AProg a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AProg a -> AProg a -> Bool
$c/= :: forall a. Eq a => AProg a -> AProg a -> Bool
== :: AProg a -> AProg a -> Bool
$c== :: forall a. Eq a => AProg a -> AProg a -> Bool
Eq, ReadPrec [AProg a]
ReadPrec (AProg a)
Int -> ReadS (AProg a)
ReadS [AProg a]
(Int -> ReadS (AProg a))
-> ReadS [AProg a]
-> ReadPrec (AProg a)
-> ReadPrec [AProg a]
-> Read (AProg a)
forall a. Read a => ReadPrec [AProg a]
forall a. Read a => ReadPrec (AProg a)
forall a. Read a => Int -> ReadS (AProg a)
forall a. Read a => ReadS [AProg a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AProg a]
$creadListPrec :: forall a. Read a => ReadPrec [AProg a]
readPrec :: ReadPrec (AProg a)
$creadPrec :: forall a. Read a => ReadPrec (AProg a)
readList :: ReadS [AProg a]
$creadList :: forall a. Read a => ReadS [AProg a]
readsPrec :: Int -> ReadS (AProg a)
$creadsPrec :: forall a. Read a => Int -> ReadS (AProg a)
Read, Int -> AProg a -> ShowS
[AProg a] -> ShowS
AProg a -> String
(Int -> AProg a -> ShowS)
-> (AProg a -> String) -> ([AProg a] -> ShowS) -> Show (AProg a)
forall a. Show a => Int -> AProg a -> ShowS
forall a. Show a => [AProg a] -> ShowS
forall a. Show a => AProg a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AProg a] -> ShowS
$cshowList :: forall a. Show a => [AProg a] -> ShowS
show :: AProg a -> String
$cshow :: forall a. Show a => AProg a -> String
showsPrec :: Int -> AProg a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> AProg a -> ShowS
Show)

data AFuncDecl a = AFunc QName Int Visibility TypeExpr (ARule a)
  deriving (AFuncDecl a -> AFuncDecl a -> Bool
(AFuncDecl a -> AFuncDecl a -> Bool)
-> (AFuncDecl a -> AFuncDecl a -> Bool) -> Eq (AFuncDecl a)
forall a. Eq a => AFuncDecl a -> AFuncDecl a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AFuncDecl a -> AFuncDecl a -> Bool
$c/= :: forall a. Eq a => AFuncDecl a -> AFuncDecl a -> Bool
== :: AFuncDecl a -> AFuncDecl a -> Bool
$c== :: forall a. Eq a => AFuncDecl a -> AFuncDecl a -> Bool
Eq, ReadPrec [AFuncDecl a]
ReadPrec (AFuncDecl a)
Int -> ReadS (AFuncDecl a)
ReadS [AFuncDecl a]
(Int -> ReadS (AFuncDecl a))
-> ReadS [AFuncDecl a]
-> ReadPrec (AFuncDecl a)
-> ReadPrec [AFuncDecl a]
-> Read (AFuncDecl a)
forall a. Read a => ReadPrec [AFuncDecl a]
forall a. Read a => ReadPrec (AFuncDecl a)
forall a. Read a => Int -> ReadS (AFuncDecl a)
forall a. Read a => ReadS [AFuncDecl a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AFuncDecl a]
$creadListPrec :: forall a. Read a => ReadPrec [AFuncDecl a]
readPrec :: ReadPrec (AFuncDecl a)
$creadPrec :: forall a. Read a => ReadPrec (AFuncDecl a)
readList :: ReadS [AFuncDecl a]
$creadList :: forall a. Read a => ReadS [AFuncDecl a]
readsPrec :: Int -> ReadS (AFuncDecl a)
$creadsPrec :: forall a. Read a => Int -> ReadS (AFuncDecl a)
Read, Int -> AFuncDecl a -> ShowS
[AFuncDecl a] -> ShowS
AFuncDecl a -> String
(Int -> AFuncDecl a -> ShowS)
-> (AFuncDecl a -> String)
-> ([AFuncDecl a] -> ShowS)
-> Show (AFuncDecl a)
forall a. Show a => Int -> AFuncDecl a -> ShowS
forall a. Show a => [AFuncDecl a] -> ShowS
forall a. Show a => AFuncDecl a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AFuncDecl a] -> ShowS
$cshowList :: forall a. Show a => [AFuncDecl a] -> ShowS
show :: AFuncDecl a -> String
$cshow :: forall a. Show a => AFuncDecl a -> String
showsPrec :: Int -> AFuncDecl a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> AFuncDecl a -> ShowS
Show)

data ARule a
  = ARule     a [(VarIndex, a)] (AExpr a)
  | AExternal a String
  deriving (ARule a -> ARule a -> Bool
(ARule a -> ARule a -> Bool)
-> (ARule a -> ARule a -> Bool) -> Eq (ARule a)
forall a. Eq a => ARule a -> ARule a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ARule a -> ARule a -> Bool
$c/= :: forall a. Eq a => ARule a -> ARule a -> Bool
== :: ARule a -> ARule a -> Bool
$c== :: forall a. Eq a => ARule a -> ARule a -> Bool
Eq, ReadPrec [ARule a]
ReadPrec (ARule a)
Int -> ReadS (ARule a)
ReadS [ARule a]
(Int -> ReadS (ARule a))
-> ReadS [ARule a]
-> ReadPrec (ARule a)
-> ReadPrec [ARule a]
-> Read (ARule a)
forall a. Read a => ReadPrec [ARule a]
forall a. Read a => ReadPrec (ARule a)
forall a. Read a => Int -> ReadS (ARule a)
forall a. Read a => ReadS [ARule a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ARule a]
$creadListPrec :: forall a. Read a => ReadPrec [ARule a]
readPrec :: ReadPrec (ARule a)
$creadPrec :: forall a. Read a => ReadPrec (ARule a)
readList :: ReadS [ARule a]
$creadList :: forall a. Read a => ReadS [ARule a]
readsPrec :: Int -> ReadS (ARule a)
$creadsPrec :: forall a. Read a => Int -> ReadS (ARule a)
Read, Int -> ARule a -> ShowS
[ARule a] -> ShowS
ARule a -> String
(Int -> ARule a -> ShowS)
-> (ARule a -> String) -> ([ARule a] -> ShowS) -> Show (ARule a)
forall a. Show a => Int -> ARule a -> ShowS
forall a. Show a => [ARule a] -> ShowS
forall a. Show a => ARule a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ARule a] -> ShowS
$cshowList :: forall a. Show a => [ARule a] -> ShowS
show :: ARule a -> String
$cshow :: forall a. Show a => ARule a -> String
showsPrec :: Int -> ARule a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> ARule a -> ShowS
Show)

data AExpr a
  = AVar   a VarIndex
  | ALit   a Literal
  | AComb  a CombType (QName, a) [AExpr a]
  | ALet   a [((VarIndex, a), AExpr a)] (AExpr a)
  | AFree  a [(VarIndex, a)] (AExpr a)
  | AOr    a (AExpr a) (AExpr a)
  | ACase  a CaseType (AExpr a) [ABranchExpr a]
  | ATyped a (AExpr a) TypeExpr
  deriving (AExpr a -> AExpr a -> Bool
(AExpr a -> AExpr a -> Bool)
-> (AExpr a -> AExpr a -> Bool) -> Eq (AExpr a)
forall a. Eq a => AExpr a -> AExpr a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AExpr a -> AExpr a -> Bool
$c/= :: forall a. Eq a => AExpr a -> AExpr a -> Bool
== :: AExpr a -> AExpr a -> Bool
$c== :: forall a. Eq a => AExpr a -> AExpr a -> Bool
Eq, ReadPrec [AExpr a]
ReadPrec (AExpr a)
Int -> ReadS (AExpr a)
ReadS [AExpr a]
(Int -> ReadS (AExpr a))
-> ReadS [AExpr a]
-> ReadPrec (AExpr a)
-> ReadPrec [AExpr a]
-> Read (AExpr a)
forall a. Read a => ReadPrec [AExpr a]
forall a. Read a => ReadPrec (AExpr a)
forall a. Read a => Int -> ReadS (AExpr a)
forall a. Read a => ReadS [AExpr a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AExpr a]
$creadListPrec :: forall a. Read a => ReadPrec [AExpr a]
readPrec :: ReadPrec (AExpr a)
$creadPrec :: forall a. Read a => ReadPrec (AExpr a)
readList :: ReadS [AExpr a]
$creadList :: forall a. Read a => ReadS [AExpr a]
readsPrec :: Int -> ReadS (AExpr a)
$creadsPrec :: forall a. Read a => Int -> ReadS (AExpr a)
Read, Int -> AExpr a -> ShowS
[AExpr a] -> ShowS
AExpr a -> String
(Int -> AExpr a -> ShowS)
-> (AExpr a -> String) -> ([AExpr a] -> ShowS) -> Show (AExpr a)
forall a. Show a => Int -> AExpr a -> ShowS
forall a. Show a => [AExpr a] -> ShowS
forall a. Show a => AExpr a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AExpr a] -> ShowS
$cshowList :: forall a. Show a => [AExpr a] -> ShowS
show :: AExpr a -> String
$cshow :: forall a. Show a => AExpr a -> String
showsPrec :: Int -> AExpr a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> AExpr a -> ShowS
Show)

data ABranchExpr a = ABranch (APattern a) (AExpr a)
  deriving (ABranchExpr a -> ABranchExpr a -> Bool
(ABranchExpr a -> ABranchExpr a -> Bool)
-> (ABranchExpr a -> ABranchExpr a -> Bool) -> Eq (ABranchExpr a)
forall a. Eq a => ABranchExpr a -> ABranchExpr a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ABranchExpr a -> ABranchExpr a -> Bool
$c/= :: forall a. Eq a => ABranchExpr a -> ABranchExpr a -> Bool
== :: ABranchExpr a -> ABranchExpr a -> Bool
$c== :: forall a. Eq a => ABranchExpr a -> ABranchExpr a -> Bool
Eq, ReadPrec [ABranchExpr a]
ReadPrec (ABranchExpr a)
Int -> ReadS (ABranchExpr a)
ReadS [ABranchExpr a]
(Int -> ReadS (ABranchExpr a))
-> ReadS [ABranchExpr a]
-> ReadPrec (ABranchExpr a)
-> ReadPrec [ABranchExpr a]
-> Read (ABranchExpr a)
forall a. Read a => ReadPrec [ABranchExpr a]
forall a. Read a => ReadPrec (ABranchExpr a)
forall a. Read a => Int -> ReadS (ABranchExpr a)
forall a. Read a => ReadS [ABranchExpr a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ABranchExpr a]
$creadListPrec :: forall a. Read a => ReadPrec [ABranchExpr a]
readPrec :: ReadPrec (ABranchExpr a)
$creadPrec :: forall a. Read a => ReadPrec (ABranchExpr a)
readList :: ReadS [ABranchExpr a]
$creadList :: forall a. Read a => ReadS [ABranchExpr a]
readsPrec :: Int -> ReadS (ABranchExpr a)
$creadsPrec :: forall a. Read a => Int -> ReadS (ABranchExpr a)
Read, Int -> ABranchExpr a -> ShowS
[ABranchExpr a] -> ShowS
ABranchExpr a -> String
(Int -> ABranchExpr a -> ShowS)
-> (ABranchExpr a -> String)
-> ([ABranchExpr a] -> ShowS)
-> Show (ABranchExpr a)
forall a. Show a => Int -> ABranchExpr a -> ShowS
forall a. Show a => [ABranchExpr a] -> ShowS
forall a. Show a => ABranchExpr a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ABranchExpr a] -> ShowS
$cshowList :: forall a. Show a => [ABranchExpr a] -> ShowS
show :: ABranchExpr a -> String
$cshow :: forall a. Show a => ABranchExpr a -> String
showsPrec :: Int -> ABranchExpr a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> ABranchExpr a -> ShowS
Show)

data APattern a
  = APattern  a (QName, a) [(VarIndex, a)]
  | ALPattern a Literal
  deriving (APattern a -> APattern a -> Bool
(APattern a -> APattern a -> Bool)
-> (APattern a -> APattern a -> Bool) -> Eq (APattern a)
forall a. Eq a => APattern a -> APattern a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: APattern a -> APattern a -> Bool
$c/= :: forall a. Eq a => APattern a -> APattern a -> Bool
== :: APattern a -> APattern a -> Bool
$c== :: forall a. Eq a => APattern a -> APattern a -> Bool
Eq, ReadPrec [APattern a]
ReadPrec (APattern a)
Int -> ReadS (APattern a)
ReadS [APattern a]
(Int -> ReadS (APattern a))
-> ReadS [APattern a]
-> ReadPrec (APattern a)
-> ReadPrec [APattern a]
-> Read (APattern a)
forall a. Read a => ReadPrec [APattern a]
forall a. Read a => ReadPrec (APattern a)
forall a. Read a => Int -> ReadS (APattern a)
forall a. Read a => ReadS [APattern a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [APattern a]
$creadListPrec :: forall a. Read a => ReadPrec [APattern a]
readPrec :: ReadPrec (APattern a)
$creadPrec :: forall a. Read a => ReadPrec (APattern a)
readList :: ReadS [APattern a]
$creadList :: forall a. Read a => ReadS [APattern a]
readsPrec :: Int -> ReadS (APattern a)
$creadsPrec :: forall a. Read a => Int -> ReadS (APattern a)
Read, Int -> APattern a -> ShowS
[APattern a] -> ShowS
APattern a -> String
(Int -> APattern a -> ShowS)
-> (APattern a -> String)
-> ([APattern a] -> ShowS)
-> Show (APattern a)
forall a. Show a => Int -> APattern a -> ShowS
forall a. Show a => [APattern a] -> ShowS
forall a. Show a => APattern a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [APattern a] -> ShowS
$cshowList :: forall a. Show a => [APattern a] -> ShowS
show :: APattern a -> String
$cshow :: forall a. Show a => APattern a -> String
showsPrec :: Int -> APattern a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> APattern a -> ShowS
Show)

instance Typeable a => Typeable (AExpr a) where
  typeOf :: AExpr a -> TypeExpr
typeOf (AVar a :: a
a _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a
  typeOf (ALit a :: a
a _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a
  typeOf (AComb a :: a
a _ _ _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a
  typeOf (ALet a :: a
a _ _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a
  typeOf (AFree a :: a
a _ _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a
  typeOf (AOr a :: a
a _ _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a
  typeOf (ACase a :: a
a _ _ _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a
  typeOf (ATyped a :: a
a _ _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a

instance Typeable a => Typeable (APattern a) where
  typeOf :: APattern a -> TypeExpr
typeOf (APattern a :: a
a _ _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a
  typeOf (ALPattern a :: a
a _) = a -> TypeExpr
forall a. Typeable a => a -> TypeExpr
typeOf a
a