1module Main where
2
3import Prelude
4import Effect.Console (log)
5
6example1 :: String
7example1 = do
8  "Do"
9  " notation"
10  " for"
11  " Semigroup"
12  where
13  discard x f = x <> f unit
14
15applySecond :: forall f a b. Apply f => f a -> f b -> f b
16applySecond fa fb = const identity <$> fa <*> fb
17
18infixl 4 applySecond as *>
19
20newtype Const a b = Const a
21
22runConst :: forall a b. Const a b -> a
23runConst (Const a) = a
24
25instance functorConst :: Functor (Const a) where
26  map _ (Const a) = Const a
27
28instance applyConst :: Semigroup a => Apply (Const a) where
29  apply (Const a1) (Const a2) = Const (a1 <> a2)
30
31example2 :: Const String Unit
32example2 = do
33  Const "Do"
34  Const " notation"
35  Const " for"
36  Const " Apply"
37  where
38  discard x f = x *> f unit
39
40main = do
41  log example1
42  log $ runConst example2
43  log "Done"
44