{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# 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 [coerce $ upcast ja, coerce $ upcast jb]
 |]

{-# 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 [coerce $ upcast ja, coerce $ upcast jb]
 |]

Update sparkle to build with distributed-closure-0.4.0.
Update sparkle to build with distributed-closure-0.4.0.
