{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE RankNTypes #-}
{-|
Copyright   : (c) Christian Gram Kalhauge, 2018
License     : MIT
Maintainer  : kalhuage@cs.ucla.edu

This module contains the stages, there are two stages; 'Low' and 'High'. 'Low'
represents closest to the metal and 'High' represents closer to the conceptual
representation.
-}
module Language.JVM.Stage
  ( Low
  , High
  , Ref
  , Index
  , DeepRef
  , Choice
  ) where

import Data.Word

-- | Any data structure that is in the low stage should be serializable using
-- the binary library.
data Low

-- | Any data structure in the 'High' stage, is easier to read.
data High

-- | The basic part of the stage system is the choice. The 'Choice' chooses
-- between two types depending on the stage.
type family Choice a b r
type instance Choice a b High = b
type instance Choice a b Low = a

-- | An index into the constant pool.
type Index = Word16

-- | A reference is a choice between an index and a value.
type Ref v r = Choice Index v r

-- | A deep reference points to something that itself is staged.
type DeepRef v r = Ref (v r) r