variant 1.0 → 1.0.1
raw patch · 5 files changed
+105/−7 lines, 5 filesdep ~base
Dependency ranges changed: base
Files
- src/lib/Data/Variant.hs +46/−1
- src/lib/Data/Variant/EGADT.hs +51/−1
- src/lib/Data/Variant/Excepts.hs +3/−4
- src/lib/Data/Variant/Tuple.hs +4/−0
- variant.cabal +1/−1
src/lib/Data/Variant.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE TypeOperators #-}@@ -326,6 +327,7 @@ {-# INLINABLE toVariantHead #-} toVariantHead a = Variant 0 (unsafeCoerce a) +#if MIN_VERSION_base(4,18,0) -- | Set the tail -- -- >>> let x = V @Int 10 :: V [Int,String,Float]@@ -333,6 +335,15 @@ -- >>> :t y -- y :: V [Double, Int, String, Float] --+#else+-- | Set the tail+--+-- >>> let x = V @Int 10 :: V [Int,String,Float]+-- >>> let y = toVariantTail @Double x+-- >>> :t y+-- y :: V '[Double, Int, String, Float]+--+#endif toVariantTail :: forall x xs. V xs -> V (x ': xs) {-# INLINABLE toVariantTail #-} toVariantTail (Variant t a) = Variant (t+1) a@@ -424,6 +435,7 @@ Nothing -> Variant t a Just x -> Variant t (unsafeCoerce (f x)) +#if MIN_VERSION_base(4,18,0) -- | Applicative update of a single variant value by index -- -- Example with `Maybe`:@@ -451,10 +463,43 @@ -- v :: V [Int, (), Float] -- -- >>> v <- mapVariantAtM @2 print x--- +-- -- >>> :t v -- v :: V [Int, [Char], ()] --+#else+-- | Applicative update of a single variant value by index+--+-- Example with `Maybe`:+--+-- >>> let f s = if s == "Test" then Just (42 :: Word) else Nothing+-- >>> let x = V @String "Test" :: V [Int,String,Float]+-- >>> mapVariantAtM @1 f x+-- Just 42+--+-- >>> let y = V @String "NotTest" :: V [Int,String,Float]+-- >>> mapVariantAtM @1 f y+-- Nothing+--+-- Example with `IO`:+--+-- >>> v <- mapVariantAtM @0 print x+--+-- >>> :t v+-- v :: V '[(), String, Float]+--+-- >>> v <- mapVariantAtM @1 print x+-- "Test"+--+-- >>> :t v+-- v :: V '[Int, (), Float]+--+-- >>> v <- mapVariantAtM @2 print x+--+-- >>> :t v+-- v :: V '[Int, [Char], ()]+--+#endif mapVariantAtM :: forall (n :: Nat) a b l m . ( KnownNat n , Applicative m
src/lib/Data/Variant/EGADT.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-}@@ -25,6 +26,7 @@ import Data.Variant.Types import Data.Variant.Functor +#if MIN_VERSION_base(4,18,0) -- $setup -- >>> :seti -XDataKinds -- >>> :seti -XTypeApplications@@ -40,7 +42,7 @@ -- >>> :{ -- >>> data LamF (ast :: Type -> Type) t where -- >>> LamF :: ( ast a -> ast b ) -> LamF ast ( a -> b )--- >>> +-- >>> -- >>> data AppF ast t where -- >>> AppF :: ast ( a -> b ) -> ast a -> AppF ast b -- >>>@@ -71,7 +73,55 @@ -- >>> let z = VF (AppF (VF (LamF f)) (VF (VarF "a"))) -- >>> :t z -- z :: EGADT [LamF, AppF, VarF] Int++#else+-- $setup+-- >>> :seti -XDataKinds+-- >>> :seti -XTypeApplications+-- >>> :seti -XTypeOperators+-- >>> :seti -XFlexibleContexts+-- >>> :seti -XTypeFamilies+-- >>> :seti -XPatternSynonyms+-- >>> :seti -XDeriveFunctor+-- >>> :seti -XGADTs+-- >>> :seti -XPolyKinds+-- >>> :seti -XPartialTypeSignatures+-- >>>+-- >>> :{+-- >>> data LamF (ast :: Type -> Type) t where+-- >>> LamF :: ( ast a -> ast b ) -> LamF ast ( a -> b )+-- >>>+-- >>> data AppF ast t where+-- >>> AppF :: ast ( a -> b ) -> ast a -> AppF ast b+-- >>>+-- >>> data VarF ast t where+-- >>> VarF :: String -> VarF ast Int+-- >>>+-- >>> type AST a = EGADT '[LamF,AppF,VarF] a+-- >>>+-- >>> :} --+-- >>> let y = VF @(AST Int) (VarF "a")+-- >>> :t y+-- y :: EGADT '[LamF, AppF, VarF] Int+--+-- >>> :{+-- >>> case y of+-- >>> VF (VarF x) -> print x+-- >>> _ -> putStrLn "Not a VarF"+-- >>> :}+-- "a"+--+-- >>> :{+-- >>> f :: AST Int -> AST Int+-- >>> f (VF (VarF x)) = VF (VarF "zz")+-- >>> f _ = error "Unhandled case"+-- >>> :}+--+-- >>> let z = VF (AppF (VF (LamF f)) (VF (VarF "a")))+-- >>> :t z+-- z :: EGADT '[LamF, AppF, VarF] Int+#endif -- | An EADT with an additional type parameter
src/lib/Data/Variant/Excepts.hs view
@@ -10,7 +10,6 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE AllowAmbiguousTypes #-}-{-# LANGUAGE BlockArguments #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-}@@ -178,8 +177,8 @@ #if MIN_VERSION_base(4,12,0) instance (MonadFail m) => MonadFail (Excepts es m) where #endif- {-# INLINABLE fail #-}- fail = Excepts . fail+ {-# INLINABLE fail #-}+ fail = Excepts . fail instance MonadTrans (Excepts e) where {-# INLINABLE lift #-}@@ -401,7 +400,7 @@ ( KnownNat (Length (b:e2)) , Monad m ) => (forall x y. m x -> m y -> m (x,y)) -> Excepts e1 m a -> Excepts e2 m b -> Excepts (Tail (Product (a:e1) (b:e2))) m (a,b)-runBothE exec f g = Excepts do+runBothE exec f g = Excepts $ do (v1,v2) <- exec (runE f) (runE g) pure (veitherProduct v1 v2)
src/lib/Data/Variant/Tuple.hs view
@@ -19,6 +19,10 @@ {-# LANGUAGE StandaloneKindSignatures #-} #endif +#if !MIN_VERSION_GLASGOW_HASKELL(8,6,0,0)+{-# LANGUAGE TypeInType #-}+#endif+ -- | Tuple helpers module Data.Variant.Tuple ( uncurry3
variant.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: variant-version: 1.0+version: 1.0.1 synopsis: Variant and EADT license: BSD-3-Clause license-file: LICENSE