text: module Main where
  
  import Prelude
  import Effect
  import Effect.Console
  
  class Newtype t a | t -> a where
    wrap :: a -> t
    unwrap :: t -> a
  
  instance newtypeMultiplicative :: Newtype (Multiplicative a) a where
    wrap = Multiplicative
    unwrap (Multiplicative a) = a
  
  data Multiplicative a = Multiplicative a
  
  instance semiringMultiplicative :: Semiring a => Semigroup (Multiplicative a) where
    append (Multiplicative a) (Multiplicative b) = Multiplicative (a * b)
  
  data Pair a = Pair a a
  
  foldPair :: forall a s. Semigroup s => (a -> s) -> Pair a -> s
  foldPair f (Pair a b) = f a <> f b
  
  ala
    :: forall f t a
     . Functor f
    => Newtype t a
    => (a -> t)
    -> ((a -> t) -> f t)
    -> f a
  ala _ f = map unwrap (f wrap)
  
  test = ala Multiplicative foldPair
  
  test1 = ala Multiplicative foldPair (Pair 2 3)
  
  main = do
    logShow (test (Pair 2 3))
    log "Done"
  