{-# LANGUAGE CPP
           , DataKinds
           , PolyKinds
           , GADTs
           , TypeOperators
           , TypeFamilies
           , ExistentialQuantification
           #-}

{-# OPTIONS_GHC -Wall -fwarn-tabs #-}
----------------------------------------------------------------
--                                                    2016.05.24
-- |
-- Module      :  Language.Hakaru.Syntax.DatumABT
-- Copyright   :  Copyright (c) 2016 the Hakaru team
-- License     :  BSD3
-- Maintainer  :  wren@community.haskell.org
-- Stability   :  experimental
-- Portability :  GHC-only
--
-- Stuff that depends on both "Language.Hakaru.Syntax.ABT" and
-- "Language.Hakaru.Syntax.Datum"; factored out to avoid the cyclic
-- dependency issues.
----------------------------------------------------------------
module Language.Hakaru.Syntax.DatumABT
    ( fromGBranch
    , toGBranch
    ) where

import Language.Hakaru.Syntax.ABT
import Language.Hakaru.Syntax.Datum

----------------------------------------------------------------
----------------------------------------------------------------

fromGBranch
    :: (ABT syn abt)
    => GBranch a (abt '[] b)
    -> Branch a abt b
fromGBranch :: GBranch a (abt '[] b) -> Branch a abt b
fromGBranch (GBranch Pattern xs a
pat List1 Variable xs
vars abt '[] b
e) =
    Pattern xs a -> abt xs b -> Branch a abt b
forall (a :: Hakaru) (abt :: [Hakaru] -> Hakaru -> *) (b :: Hakaru)
       (xs :: [Hakaru]).
Pattern xs a -> abt xs b -> Branch a abt b
Branch Pattern xs a
pat (List1 Variable xs -> abt '[] b -> abt xs b
forall k (syn :: ([k] -> k -> *) -> k -> *) (abt :: [k] -> k -> *)
       (xs :: [k]) (b :: k).
ABT syn abt =>
List1 Variable xs -> abt '[] b -> abt xs b
binds_ List1 Variable xs
vars abt '[] b
e)

toGBranch
    :: (ABT syn abt)
    => Branch a abt b
    -> GBranch a (abt '[] b)
toGBranch :: Branch a abt b -> GBranch a (abt '[] b)
toGBranch (Branch Pattern xs a
pat abt xs b
body) =
    (List1 Variable xs -> abt '[] b -> GBranch a (abt '[] b))
-> (List1 Variable xs, abt '[] b) -> GBranch a (abt '[] b)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (Pattern xs a
-> List1 Variable xs -> abt '[] b -> GBranch a (abt '[] b)
forall (a :: Hakaru) r (xs :: [Hakaru]).
Pattern xs a -> List1 Variable xs -> r -> GBranch a r
GBranch Pattern xs a
pat) (abt xs b -> (List1 Variable xs, abt '[] b)
forall k (syn :: ([k] -> k -> *) -> k -> *) (abt :: [k] -> k -> *)
       (xs :: [k]) (a :: k).
ABT syn abt =>
abt xs a -> (List1 Variable xs, abt '[] a)
caseBinds abt xs b
body)

----------------------------------------------------------------
----------------------------------------------------------- fin.