{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ImplicitParams #-}
module Haskus.Utils.Variant.Cont
( fret
, fretN
, freturn
, freturnN
, frec
, fIf
, Then (..)
, Else (..)
)
where
import Haskus.Utils.Tuple
import Haskus.Utils.Types
import Haskus.Utils.ContFlow
#define fdo ContFlow $ \__cs -> let ?__cs = __cs in do
fret :: forall x r t n xs.
( ExtractTuple n t (x -> r)
, xs ~ ContTupleToList t r
, CheckMember x xs
, n ~ IndexOf x xs
, KnownNat n
, CheckNub xs
) => t -> (x -> r)
{-# INLINE fret #-}
fret = tupleN @n @t @(x -> r)
freturn :: forall x r t n xs.
( ExtractTuple n t (x -> r)
, xs ~ ContTupleToList t r
, CheckMember x xs
, n ~ IndexOf x xs
, KnownNat n
, CheckNub xs
, ?__cs :: t
) => x -> r
{-# INLINE freturn #-}
freturn = fret ?__cs
fretN :: forall n x r t xs.
( ExtractTuple n t (x -> r)
, xs ~ ContTupleToList t r
, x ~ Index n xs
, KnownNat n
) => t -> (x -> r)
{-# INLINE fretN #-}
fretN = tupleN @n @t @(x -> r)
freturnN :: forall n x r t xs.
( ExtractTuple n t (x -> r)
, xs ~ ContTupleToList t r
, x ~ Index n xs
, KnownNat n
, ?__cs :: t
) => x -> r
{-# INLINE freturnN #-}
freturnN = fretN @n ?__cs
frec :: forall r xs.
( ?__cs :: ContListToTuple xs r
) => ContFlow xs r -> r
frec f = f >::> ?__cs
data Then = Then
data Else = Else
fIf :: Bool -> ContFlow '[Then,Else] r
{-# INLINE fIf #-}
fIf b = fdo
case b of
True -> freturn Then
False -> freturn Else