functor-combinators-0.4.1.3: Tools for functor combinator-based program design
Copyright(c) Justin Le 2019
LicenseBSD3
Maintainerjustin@jle.im
Stabilityexperimental
Portabilitynon-portable
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Functor.Combinator.Unsafe

Description

Working with non-standard typeclasses like Plus, Apply, Bind, and Pointed will sometimes cause problems when using with libraries that do not provide instances, even though their types already are instances of Alternative or Applicative or Monad.

This module provides unsafe methods to "promote" Applicative instances to Apply, Alternative to Plus, etc.

They are unsafe in the sense that if those types already have those instances, this will cause overlapping instances errors or problems with coherence. Because of this, you should always use these with specific fs, and never in a polymorphic way over f.

Synopsis

Documentation

unsafePlus :: forall f proxy r. Alternative f => proxy f -> (Plus f => r) -> r Source #

For any Alternative f, produce a value that would require Plus f.

Always use with concrete and specific f only, and never use with any f that already has a Plus instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

unsafeApply :: forall f proxy r. Applicative f => proxy f -> (Apply f => r) -> r Source #

For any Applicative f, produce a value that would require Apply f.

Always use with concrete and specific f only, and never use with any f that already has a Apply instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

unsafeBind :: forall f proxy r. Monad f => proxy f -> (Bind f => r) -> r Source #

For any Monad f, produce a value that would require Bind f.

Always use with concrete and specific f only, and never use with any f that already has a Bind instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

unsafePointed :: forall f proxy r. Applicative f => proxy f -> (Pointed f => r) -> r Source #

For any Applicative f, produce a value that would require Pointed f.

Always use with concrete and specific f only, and never use with any f that already has a Pointed instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

unsafeConclude :: forall f proxy r. Decidable f => proxy f -> (Conclude f => r) -> r Source #

For any Decidable f, produce a value that would require Conclude f.

Always use with concrete and specific f only, and never use with any f that already has a Conclude instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

Since: 0.3.0.0

unsafeDivise :: forall f proxy r. Divisible f => proxy f -> (Divise f => r) -> r Source #

For any Divisible f, produce a value that would require Divise f.

Always use with concrete and specific f only, and never use with any f that already has a Divise instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

Since: 0.3.0.0

unsafeInvariantCo :: forall f proxy r. Functor f => proxy f -> (Invariant f => r) -> r Source #

For any Functor f, produce a value that would require Invariant f.

Always use with concrete and specific f only, and never use with any f that already has an Invariant instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

Since: 0.4.1.0

unsafeInvariantContra :: forall f proxy r. Contravariant f => proxy f -> (Invariant f => r) -> r Source #

For any Contravariant f, produce a value that would require Invariant f.

Always use with concrete and specific f only, and never use with any f that already has an Invariant instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

Since: 0.4.1.0

unsafeInplyCo :: forall f proxy r. Apply f => proxy f -> (Inply f => r) -> r Source #

For any Apply f, produce a value that would require Inply f.

Always use with concrete and specific f only, and never use with any f that already has an Inply instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

Since: 0.4.1.0

unsafeInplyContra :: forall f proxy r. Divise f => proxy f -> (Inply f => r) -> r Source #

For any Divise f, produce a value that would require Inply f.

Always use with concrete and specific f only, and never use with any f that already has an Inply instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

Since: 0.4.1.0

unsafeInplicativeCo :: forall f proxy r. (Applicative f, Invariant f) => proxy f -> (Inplicative f => r) -> r Source #

For any Applicative f, produce a value that would require Inplicative f.

Always use with concrete and specific f only, and never use with any f that already has an Inplicative instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

Since: 0.4.1.0

unsafeInplicativeContra :: forall f proxy r. (Divisible f, Invariant f) => proxy f -> (Inplicative f => r) -> r Source #

For any Divisibl3 f, produce a value that would require Inplicative f.

Always use with concrete and specific f only, and never use with any f that already has an Inplicative instance.

The Proxy argument allows you to specify which specific f you want to enhance. You can pass in something like Proxy @MyFunctor.

Since: 0.4.1.0