deepcontrol-0.4.2.1: Provide more deeper level style of programming than the usual Control.xxx modules express

CopyrightConor McBride and Ross Paterson 2005
(c) 2015 KONISHI Yohsuke
LicenseBSD-style (see the LICENSE file in the distribution)
Maintainerocean0yohsuke@gmail.com
Stabilityexperimental
Portability---
Safe HaskellSafe
LanguageHaskell2010

DeepControl.Commutative

Contents

Description

This module is made of Traversable, distilling most function names polluted with action kind of concepts into crystalized(static) ones.

Synopsis

The Commutative class

class Applicative c => Commutative c where Source #

[], Maybe, Either, Except and Writer are all commutative each other. So these monads can be deepened to Monad2, Monad3, Monad4 and Monad5.

Minimal complete definition

commute

Methods

commute :: Applicative f => c (f a) -> f (c a) Source #

This method is equivalent for sequenceA except the name. The only difference is the name "commute", that is to say from which no action kind of concepts smell.

>>> commute $ Just [1]
[Just 1]
>>> commute $ [Just 1]
Just [1]
>>> commute $ Right (Just 1)
Just (Right 1)
>>> commute $ Just (Right 1)
Right (Just 1)

Instances

Commutative [] Source # 

Methods

commute :: Applicative f => [f a] -> f [a] Source #

Commutative Maybe Source # 

Methods

commute :: Applicative f => Maybe (f a) -> f (Maybe a) Source #

Commutative (Either a) Source # 

Methods

commute :: Applicative f => Either a (f a) -> f (Either a a) Source #

Commutative (Except e) Source # 

Methods

commute :: Applicative f => Except e (f a) -> f (Except e a) Source #

Monoid w => Commutative (Writer w) Source # 

Methods

commute :: Applicative f => Writer w (f a) -> f (Writer w a) Source #

(Commutative f1, Commutative f2) => Commutative (IdentityT2 f1 f2) Source # 

Methods

commute :: Applicative f => IdentityT2 f1 f2 (f a) -> f (IdentityT2 f1 f2 a) Source #

(Commutative f1, Commutative f2, Commutative f3) => Commutative (IdentityT3 f1 f2 f3) Source # 

Methods

commute :: Applicative f => IdentityT3 f1 f2 f3 (f a) -> f (IdentityT3 f1 f2 f3 a) Source #

(Commutative f1, Commutative f2, Commutative f3, Commutative f4) => Commutative (IdentityT4 f1 f2 f3 f4) Source # 

Methods

commute :: Applicative f => IdentityT4 f1 f2 f3 f4 (f a) -> f (IdentityT4 f1 f2 f3 f4 a) Source #

(Commutative f1, Commutative f2, Commutative f3, Commutative f4, Commutative f5) => Commutative (IdentityT5 f1 f2 f3 f4 f5) Source # 

Methods

commute :: Applicative f => IdentityT5 f1 f2 f3 f4 f5 (f a) -> f (IdentityT5 f1 f2 f3 f4 f5 a) Source #

Utility functions

cmap :: (Applicative f, Commutative c) => (a -> f b) -> c a -> f (c b) Source #

Do fmap f then commute, equivalent for traverse.

cfor :: (Applicative f, Commutative c) => c a -> (a -> f b) -> f (c b) Source #

The auguments-flipped function for cmap, equivalent for for.

General definitions for superclass methods

fmapDefault :: Commutative t => (a -> b) -> t a -> t b Source #

This function may be used as a value for fmap in a Functor instance, provided that commute is defined. (Using fmapDefault with a Commutative instance will result in infinite recursion.)

foldMapDefault :: (Commutative t, Monoid m) => (a -> m) -> t a -> m Source #

This function may be used as a value for foldMap in a Foldable instance.

Utility functions 2

Level-2

sink2 :: (Commutative m1, Commutative m2, Applicative m3) => m1 (m2 (m3 a)) -> m2 (m3 (m1 a)) Source #

sink2 = (commute|$>) . commute

>>> sink2 $ Right (Just [1])
Just [Right 1]

float2 :: (Applicative m1, Commutative m2, Commutative m3) => m2 (m3 (m1 a)) -> m1 (m2 (m3 a)) Source #

float2 = commute . (commute|$>)

>>> float2 $ Just [Right 1]
Right (Just [1])

Level-3

sink3 :: (Commutative m1, Commutative m2, Commutative m3, Applicative m4) => m1 (m2 (m3 (m4 a))) -> m2 (m3 (m4 (m1 a))) Source #

sink3 = (sink2|$>) . commute

>>> sink3 $ Right [Just [1]]
[Just [Right 1]]

float3 :: (Applicative m1, Commutative m2, Commutative m3, Commutative m4) => m2 (m3 (m4 (m1 a))) -> m1 (m2 (m3 (m4 a))) Source #

float3 = commute . (float2|$>)

>>> float3 $ [Just [Right 1]]
Right [Just [1]]

Level-4

sink4 :: (Commutative m1, Commutative m2, Commutative m3, Commutative m4, Applicative m5) => m1 (m2 (m3 (m4 (m5 a)))) -> m2 (m3 (m4 (m5 (m1 a)))) Source #

float4 :: (Applicative m1, Commutative m2, Commutative m3, Commutative m4, Commutative m5) => m2 (m3 (m4 (m5 (m1 a)))) -> m1 (m2 (m3 (m4 (m5 a)))) Source #

Level-5

sink5 :: (Commutative m1, Commutative m2, Commutative m3, Commutative m4, Commutative m5, Applicative m6) => m1 (m2 (m3 (m4 (m5 (m6 a))))) -> m2 (m3 (m4 (m5 (m6 (m1 a))))) Source #

float5 :: (Applicative m1, Commutative m2, Commutative m3, Commutative m4, Commutative m5, Commutative m6) => m2 (m3 (m4 (m5 (m6 (m1 a))))) -> m1 (m2 (m3 (m4 (m5 (m6 a))))) Source #