packages feed

haskus-utils-variant 2.0.2 → 2.0.3

raw patch · 5 files changed

+68/−2 lines, 5 files

Files

haskus-utils-variant.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.20 name: haskus-utils-variant-version: 2.0.2+version: 2.0.3 license: BSD3 license-file: LICENSE copyright: Sylvain Henry 2018@@ -24,6 +24,7 @@         Haskus.Utils.Variant         Haskus.Utils.Variant.Flow         Haskus.Utils.Variant.Cont+        Haskus.Utils.Variant.Syntax         Haskus.Utils.EADT         Haskus.Utils.EADT.TH     hs-source-dirs: src/lib
src/lib/Haskus/Utils/ContFlow.hs view
@@ -18,6 +18,7 @@    , ContTupleToList    , StripR    , AddR+   , MultiCont (..)    ) where @@ -73,3 +74,11 @@ infixl 0 >:%:>  +class MultiCont a where+   type MultiContTypes a :: [*]++   -- | Convert a data into a multi-continuation+   toCont :: a -> ContFlow (MultiContTypes a) r++   -- | Convert a data into a multi-continuation (monadic)+   toContM :: Monad m => m a -> ContFlow (MultiContTypes a) (m r)
src/lib/Haskus/Utils/EADT.hs view
@@ -262,6 +262,11 @@    ) => ContFlow (ApplyAll e xs) (m (V (ApplyAll e xs))) -> m (VariantF xs e) contToVariantFM f = VariantF <$> contToVariantM f +instance ContVariant (ApplyAll e xs) => MultiCont (VariantF xs e) where+   type MultiContTypes (VariantF xs e) = ApplyAll e xs+   toCont = variantFToCont+   toContM = variantFToContM+ -------------------------------------------- -- Extensible ADT --------------------------------------------@@ -311,7 +316,7 @@ liftEADT = cata (Fix . liftVariantF)  -- | Pop an EADT value-popEADT :: forall xs f e.+popEADT :: forall f xs e.    ( f :<: xs    , e ~ EADT xs    , f e :< ApplyAll e xs
src/lib/Haskus/Utils/Variant.hs view
@@ -37,6 +37,8 @@    , mapVariantAtM    , foldMapVariantAt    , foldMapVariantAtM+   , bindVariant+   , constBindVariant    -- * Operations by type    , toVariant    , Member@@ -270,6 +272,22 @@       Nothing -> pure (Variant t a)       Just x  -> Variant t <$> unsafeCoerce (f x) +-- | Bind (>>=) for a Variant+bindVariant :: forall x xs ys.+   ( KnownNat (Length ys)+   ) => V (x ': xs) -> (x -> V ys) -> V (Concat ys xs)+{-# INLINABLE bindVariant #-}+v `bindVariant` f  = case popVariantHead v of+   Right x  -> appendVariant @xs (f x)+   Left  xs -> prependVariant @ys xs++-- | Const bind (>>) for a Variant+constBindVariant :: forall xs ys.+   V xs -> V ys -> V (Concat ys xs)+{-# INLINABLE constBindVariant #-}+_ `constBindVariant` v2 = appendVariant @xs v2++ ----------------------------------------------------------- -- Operations by type -----------------------------------------------------------@@ -865,6 +883,10 @@ variantToTuple = hToTuple' . variantToHList  +instance ContVariant xs => MultiCont (V xs) where+   type MultiContTypes (V xs) = xs+   toCont  = variantToCont+   toContM = variantToContM  class ContVariant xs where    -- | Convert a variant into a multi-continuation
+ src/lib/Haskus/Utils/Variant/Syntax.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE DataKinds #-}++-- | Rebindable syntax for Variant+module Haskus.Utils.Variant.Syntax+   ( (>>=)+   , (>>)+   , return+   )+where++import Haskus.Utils.Variant+import Haskus.Utils.Types+import Haskus.Utils.Types.List++import Prelude hiding ((>>=),(>>),return)++(>>=) :: forall x xs ys. +   ( KnownNat (Length ys)+   ) => V (x ': xs) -> (x -> V ys) -> V (Concat ys xs)+(>>=) = bindVariant++(>>) :: V xs -> V ys -> V (Concat ys xs)+(>>) = constBindVariant++return :: x -> V '[x]+return = variantFromValue