View difference between Paste ID: 1UZddvrJ and T3C4K4xB
SHOW: | | - or go back to the newest paste.
1
{-# LANGUAGE DataKinds #-}
2
module Test where 
3
4
import Data.WorldPeace (OpenUnion, openUnionLift, relaxOpenUnion)
5
import Data.Bifunctor (first)
6
7
data ErrorOne = ErrorOne
8
data ErrorTwo = ErrorTwo Int
9
data ErrorThree = ErrorThree String
10
11
checkOne :: Int -> Either (OpenUnion '[ErrorOne]) Int
12
checkOne x = case x of
13
    1 -> Left $ openUnionLift ErrorOne
14
    otherwise -> Right x
15
16
checkTwo :: Int -> Either (OpenUnion '[ErrorOne, ErrorTwo]) Int
17
checkTwo x = case x of
18
    2 -> Left $ openUnionLift ErrorOne
19
    3 -> Left $ openUnionLift $ ErrorTwo 3
20
    otherwise -> Right x
21
22
checkThree :: Int -> Either (OpenUnion '[ErrorThree]) Int
23
checkThree x = case x of
24
    4 -> Left $ openUnionLift $ ErrorThree "error"
25
    otherwise -> Right x
26
27
checkAll :: Int -> Either (OpenUnion '[ErrorOne, ErrorTwo, ErrorThree]) Int
28
checkAll x = do
29
    a <- first (relaxOpenUnion) $ checkOne x
30
    b <- first (relaxOpenUnion) $ checkTwo a
31
    c <- first (relaxOpenUnion) $ checkThree b
32
    pure b