{-# LANGUAGE GADTs #-}

-- | Tokens represent future values.
module Byg.Types.Token
  ( Token(..)
  ) where

import Type.Reflection (Typeable)

data Token a where
  Token :: (Typeable a, Show a) => Int -> Token a
  TupleToken :: (Typeable a, Show a, Typeable b, Show b) => Token a -> Token b -> Token (a, b)
  ZipToken :: (Typeable a, Show a, Typeable b, Show b) => Token [a] -> Token [b] -> Token [(a, b)]
  ListToken :: (Typeable a, Show a) => [Token a] -> Token [a]
  NoToken :: Token ()

deriving instance Show (Token a)
