File: Extras.hs

package info (click to toggle)
haskell-contravariant-extras 0.3.5.4-1
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 80 kB
  • sloc: haskell: 325; makefile: 5
file content (63 lines) | stat: -rw-r--r-- 1,528 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
module Contravariant.Extras
  ( -- |
    --  @contrazip@ functions of multiple arities.
    module Contravariant.Extras.Contrazip,
    -- |
    --  @contrazipLifting@ functions of multiple arities.
    module Contravariant.Extras.ContrazipLifting,
    (>*<),
    contramany,
    Supplied (..),
  )
where

import Contravariant.Extras.Contrazip
import Contravariant.Extras.ContrazipLifting
import Contravariant.Extras.Prelude hiding ((<>))
import Data.Semigroup (Semigroup ((<>)))

-- |
-- An alias to 'divided'.
{-# INLINE (>*<) #-}
(>*<) :: (Divisible f) => f a -> f b -> f (a, b)
(>*<) =
  divided

contramany :: (Decidable f) => f a -> f [a]
contramany f =
  loop
  where
    loop =
      choose chooser cons nil
      where
        chooser =
          \case
            head : tail ->
              Left (head, tail)
            _ ->
              Right ()
        cons =
          divide id f loop
        nil =
          conquer

-- |
-- A combination of a divisible functor with some input for it.
-- Allows to use the 'Monoid' API for composition.
data Supplied divisible
  = forall input. Supplied (divisible input) input

instance (Divisible divisible) => Semigroup (Supplied divisible) where
  Supplied divisible1 input1 <> Supplied divisible2 input2 =
    Supplied divisible3 input3
    where
      divisible3 =
        divide id divisible1 divisible2
      input3 =
        (input1, input2)

instance (Divisible divisible) => Monoid (Supplied divisible) where
  mempty =
    Supplied conquer ()
  mappend =
    (<>)