content: {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  {-# LANGUAGE StaticPointers #-}
  {-# LANGUAGE TemplateHaskell #-}
  {-# LANGUAGE TypeFamilies #-}
  {-# LANGUAGE TypeOperators #-}
  
  {-# OPTIONS_GHC -fno-warn-orphans #-}
  
  module Language.Scala.Tuple where
  
  import Control.Distributed.Closure.TH
  import Language.Java
  
  data Tuple2 a b = Tuple2 a b
    deriving (Show, Eq)
  
  withStatic [d|
  
    instance (Interpretation a, Interpretation b) =>
             Interpretation (Tuple2 a b) where
      type Interp (Tuple2 a b) =
        'Class "scala.Tuple2" <> '[Interp a, Interp b]
  
    instance (Reify a, Reify b) =>
             Reify (Tuple2 a b) where
      reify jobj = do
        ja <- call jobj "_1"
        jb <- call jobj "_2"
        Tuple2 <$> (reify $ unsafeCast (ja :: JObject))
               <*> (reify $ unsafeCast (jb :: JObject))
  
    instance (Reflect a, Reflect b) =>
             Reflect (Tuple2 a b) where
      reflect (Tuple2 a b) = do
        ja <- reflect a
        jb <- reflect b
        generic <$> new (upcast ja) (upcast jb)
   |]
  