bluefin-internal 0.4.1.0 → 0.4.2.0
raw patch · 7 files changed
+129/−8 lines, 7 filesdep +primitivePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: primitive
API changes (from Hackage documentation)
+ Bluefin.Internal.DslBuilderEff: MkDslBuilderEff :: (forall (e :: Effects). () => h e -> Eff (e :& es) r) -> DslBuilderEff (h :: Effects -> Type) (es :: Effects) r
+ Bluefin.Internal.DslBuilderEff: [unMkDslBuilderEff] :: DslBuilderEff (h :: Effects -> Type) (es :: Effects) r -> forall (e :: Effects). () => h e -> Eff (e :& es) r
+ Bluefin.Internal.DslBuilderEff: dslBuilderEff :: forall h (es :: Effects) r. (forall (e :: Effects). () => h e -> Eff (e :& es) r) -> DslBuilderEff h es r
+ Bluefin.Internal.DslBuilderEff: instance (e Bluefin.Internal.:> es) => Bluefin.Internal.OneWayCoercible.OneWayCoercible (Bluefin.Internal.DslBuilderEff.DslBuilderEff h e r) (Bluefin.Internal.DslBuilderEff.DslBuilderEff h es r)
+ Bluefin.Internal.DslBuilderEff: instance Bluefin.Internal.Handle h => GHC.Base.Applicative (Bluefin.Internal.DslBuilderEff.DslBuilderEff h es)
+ Bluefin.Internal.DslBuilderEff: instance Bluefin.Internal.Handle h => GHC.Base.Functor (Bluefin.Internal.DslBuilderEff.DslBuilderEff h es)
+ Bluefin.Internal.DslBuilderEff: instance Bluefin.Internal.Handle h => GHC.Base.Monad (Bluefin.Internal.DslBuilderEff.DslBuilderEff h es)
+ Bluefin.Internal.DslBuilderEff: newtype DslBuilderEff (h :: Effects -> Type) (es :: Effects) r
+ Bluefin.Internal.DslBuilderEff: runDslBuilderEff :: forall h (es :: Effects) r. h es -> DslBuilderEff h es r -> Eff es r
+ Bluefin.Internal.DslBuilderEff: useImplDslBuilderEff :: forall (e :: Effects) (es :: Effects) (h :: Effects -> Type) r. e :> es => DslBuilderEff h e r -> DslBuilderEff h es r
+ Bluefin.Internal.Prim: UnsafeMkPrim :: Prim (e :: Effects)
+ Bluefin.Internal.Prim: data Prim (e :: Effects)
+ Bluefin.Internal.Prim: data PrimStateEff (es :: k)
+ Bluefin.Internal.Prim: instance (e Bluefin.Internal.:> es) => Bluefin.Internal.OneWayCoercible.OneWayCoercible (Bluefin.Internal.Prim.Prim e) (Bluefin.Internal.Prim.Prim es)
+ Bluefin.Internal.Prim: instance Bluefin.Internal.Handle Bluefin.Internal.Prim.Prim
+ Bluefin.Internal.Prim: primitive :: forall (e1 :: Effects) (es :: Effects) (e2 :: Effects) a. (e1 :> es, e2 :> es) => Prim e1 -> (State# (PrimStateEff e2) -> (# State# (PrimStateEff e2), a #)) -> Eff es a
- Bluefin.Internal: cycleToStream :: forall f (ea :: Effects) (es :: Effects) a. (Foldable f, ea :> es) => f a -> Stream a ea -> Eff es ()
+ Bluefin.Internal: cycleToStream :: forall f (e1 :: Effects) (es :: Effects) a. (Foldable f, e1 :> es) => f a -> Stream a e1 -> Eff es ()
- Bluefin.Internal: takeConsume :: forall (ea :: Effects) (es :: Effects) (eb :: Effects) a. (ea :> es, eb :> es) => Int -> Consume a ea -> Stream a eb -> Eff es ()
+ Bluefin.Internal: takeConsume :: forall (e1 :: Effects) (es :: Effects) (e2 :: Effects) a. (e1 :> es, e2 :> es) => Int -> Consume a e1 -> Stream a e2 -> Eff es ()
Files
- CHANGELOG.md +6/−0
- bluefin-internal.cabal +4/−1
- src/Bluefin/Internal.hs +5/−5
- src/Bluefin/Internal/DslBuilderEff.hs +57/−0
- src/Bluefin/Internal/DslBuilderEffects.hs +5/−1
- src/Bluefin/Internal/Pipes.hs +19/−1
- src/Bluefin/Internal/Prim.hs +33/−0
CHANGELOG.md view
@@ -1,3 +1,9 @@+# 0.4.2.0++* Add `Bluefin.Internal.DslBuilderEff`++* Add `Bluefin.Internal.Prim`+ # 0.4.1.0 * Add `MonadFix` instance for `Eff`, thanks to Adriaan Leijnse
bluefin-internal.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: bluefin-internal-version: 0.4.1.0+version: 0.4.2.0 license: MIT license-file: LICENSE author: Tom Ellis@@ -78,6 +78,7 @@ async >= 2.2 && < 2.3, base >= 4.14 && < 4.23, unliftio-core < 0.3,+ primitive >= 0.9, transformers < 0.7, transformers-base < 0.5, monad-control < 1.1@@ -85,6 +86,7 @@ Bluefin.Internal, Bluefin.Internal.CloneableHandle, Bluefin.Internal.DslBuilder,+ Bluefin.Internal.DslBuilderEff, Bluefin.Internal.DslBuilderEffects, Bluefin.Internal.Examples, Bluefin.Internal.Exception,@@ -92,6 +94,7 @@ Bluefin.Internal.Key, Bluefin.Internal.OneWayCoercible, Bluefin.Internal.Pipes,+ Bluefin.Internal.Prim, Bluefin.Internal.System.IO test-suite bluefin-test
src/Bluefin/Internal.hs view
@@ -1340,9 +1340,9 @@ -- ([1,2,3,1,2,3],()) -- @ cycleToStream ::- (Foldable f, ea :> es) =>+ (Foldable f, e1 :> es) => f a ->- Stream a ea ->+ Stream a e1 -> -- | ͘ Eff es () cycleToStream f y = do@@ -1357,10 +1357,10 @@ -- ([1,2,3,4],()) -- @ takeConsume ::- (ea :> es, eb :> es) =>+ (e1 :> es, e2 :> es) => Int ->- Consume a ea ->- Stream a eb ->+ Consume a e1 ->+ Stream a e2-> -- | ͘ Eff es () takeConsume count source sink = loop count
+ src/Bluefin/Internal/DslBuilderEff.hs view
@@ -0,0 +1,57 @@+{-# LANGUAGE DerivingVia #-}+{-# LANGUAGE QuantifiedConstraints #-}++module Bluefin.Internal.DslBuilderEff where++import Bluefin.Internal+import Bluefin.Internal.OneWayCoercible+ ( OneWayCoercible,+ oneWayCoerce,+ oneWayCoercible,+ oneWayCoercibleImpl,+ )++newtype DslBuilderEff h es r+ = MkDslBuilderEff {unMkDslBuilderEff :: forall e. h e -> Eff (e :& es) r}++useImplDslBuilderEff ::+ (e :> es) =>+ DslBuilderEff h e r ->+ -- | ͘+ DslBuilderEff h es r+useImplDslBuilderEff = oneWayCoerce++runDslBuilderEff ::+ h es ->+ DslBuilderEff h es r ->+ -- | ͘+ Eff es r+runDslBuilderEff h f = makeOp (unMkDslBuilderEff f h)++dslBuilderEff ::+ (forall e. h e -> Eff (e :& es) r) ->+ -- | ͘+ DslBuilderEff h es r+dslBuilderEff = MkDslBuilderEff++instance+ (e :> es) =>+ OneWayCoercible (DslBuilderEff h e r) (DslBuilderEff h es r)+ where+ oneWayCoercibleImpl = oneWayCoercible++instance (Handle h) => Functor (DslBuilderEff h es) where+ fmap f g =+ dslBuilderEff $ \h ->+ fmap f (runDslBuilderEff (mapHandle h) (useImplDslBuilderEff g))++instance (Handle h) => Applicative (DslBuilderEff h es) where+ pure x = dslBuilderEff (pure (pure x))+ f <*> x = dslBuilderEff $ \h ->+ runDslBuilderEff (mapHandle h) (useImplDslBuilderEff f)+ <*> runDslBuilderEff (mapHandle h) (useImplDslBuilderEff x)++instance (Handle h) => Monad (DslBuilderEff h es) where+ m >>= f = dslBuilderEff $ \h -> do+ r <- runDslBuilderEff (mapHandle h) (useImplDslBuilderEff m)+ runDslBuilderEff (mapHandle h) (useImplDslBuilderEff (f r))
src/Bluefin/Internal/DslBuilderEffects.hs view
@@ -1,3 +1,6 @@+-- This will probably be superseded by DslBuilderEff because the+-- latter has a better name+ {-# LANGUAGE DerivingVia #-} {-# LANGUAGE QuantifiedConstraints #-} @@ -8,13 +11,14 @@ ( OneWayCoercible, oneWayCoercible, oneWayCoercibleImpl,+ oneWayCoerce, ) newtype DslBuilderEffects h es r = MkDslBuilderEffects {unMkDslBuilderEffects :: forall e. h e -> Eff (e :& es) r} useImplDslBuilderEffects :: (e :> es) => DslBuilderEffects h e r -> DslBuilderEffects h es r-useImplDslBuilderEffects (MkDslBuilderEffects f) = MkDslBuilderEffects (useImplUnder . f)+useImplDslBuilderEffects = oneWayCoerce runDslBuilderEffects :: h es -> DslBuilderEffects h es r -> Eff es r runDslBuilderEffects h f = makeOp (unMkDslBuilderEffects f h)
src/Bluefin/Internal/Pipes.hs view
@@ -1,6 +1,24 @@ module Bluefin.Internal.Pipes where -import Bluefin.Internal hiding (await, yield)+import Bluefin.Internal+ ( Coroutine,+ Eff,+ IOE,+ effIO,+ evalState,+ forEach,+ get,+ mapHandle,+ put,+ receiveStream,+ returnEarly,+ useImpl,+ useImplIn,+ withEarlyReturn,+ yieldCoroutine,+ (:&),+ (:>),+ ) import Bluefin.Internal qualified import Control.Monad (forever) import Data.Foldable (for_)
+ src/Bluefin/Internal/Prim.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE UnboxedTuples #-}+{-# LANGUAGE DerivingVia #-}++module Bluefin.Internal.Prim where++import Bluefin.Internal+import Bluefin.Internal.OneWayCoercible+import Control.Monad.Primitive qualified as P+import GHC.Exts (State#)+import Unsafe.Coerce (unsafeCoerce)++-- I suppose morally this is+--+-- (State# (PrimStateEff e -> (# State# (PrimStateEff e), a #))+--+-- but since there can only be one valid implementation it doesn't+-- seem worth doing it like that.+data Prim (e :: Effects) = UnsafeMkPrim+ deriving Handle via OneWayCoercibleHandle Prim++data PrimStateEff es++instance (e :> es) => OneWayCoercible (Prim e) (Prim es) where+ oneWayCoercibleImpl = unsafeOneWayCoercible++primitive ::+ (e1 :> es, e2 :> es) =>+ Prim e1 ->+ (State# (PrimStateEff e2) -> (# State# (PrimStateEff e2), a #)) ->+ -- | ͘+ Eff es a+primitive UnsafeMkPrim = unsafeCoerce (P.primitive @IO)