0 | module Data.List.Alternating
2 | import Data.Bifoldable
20 | data Odd a b = (::) a (Even b a)
27 | data Even a b = Nil | (::) a (Odd b a)
29 | %name Odd
xs, ys, zs
30 | %name Even
xs, ys, zs
34 | Eq a => Eq b => Eq (Odd a b) where
35 | x :: xs == y :: ys = x == y && assert_total (xs == ys)
38 | Eq a => Eq b => Eq (Even a b) where
40 | x :: xs == y :: ys = x == y && xs == ys
45 | Ord a => Ord b => Ord (Odd a b) where
46 | compare (x :: xs) (y ::ys)
47 | = case compare x y of
48 | EQ => assert_total (compare xs ys)
52 | Ord a => Ord b => Ord (Even a b) where
54 | compare [] (x :: xs) = LT
55 | compare (x :: xs) [] = GT
56 | compare (x :: xs) (y ::ys)
57 | = case compare x y of
64 | bimap f g (x :: xs) = (f x) :: assert_total (bimap g f xs)
67 | Bifunctor Even where
69 | bimap f g (x :: xs) = (f x) :: (bimap g f xs)
73 | Bifoldable Odd where
74 | bifoldr f g acc (x :: xs) = f x (assert_total $
bifoldr g f acc xs)
76 | bifoldl f g acc (x :: xs) = assert_total $
bifoldl g f (f acc x) xs
79 | Bifoldable Even where
80 | bifoldr f g acc [] = acc
81 | bifoldr f g acc (x :: xs) = f x (bifoldr g f acc xs)
83 | bifoldl f g acc [] = acc
84 | bifoldl f g acc (x :: xs) = bifoldl g f (f acc x) xs
88 | Bitraversable Odd where
89 | bitraverse f g (x :: xs) = [| f x :: assert_total (bitraverse g f xs) |]
92 | Bitraversable Even where
93 | bitraverse f g [] = [| [] |]
94 | bitraverse f g (x :: xs) = [| f x :: bitraverse g f xs |]
98 | Functor (Odd a) where
103 | [FstFunctor] Functor (\a => Odd a b) where
109 | (++) : Odd a b -> Odd b a -> Even a b
110 | (x :: xs) ++ ys = x :: xs ++ ys
114 | (++) : Even a b -> Odd a b -> Odd a b
116 | (x :: xs) ++ ys = x :: xs ++ ys
121 | (++) : Even a b -> Even a b -> Even a b
123 | (x :: xs) ++ ys = x :: xs ++ ys
127 | (++) : Odd a b -> Even b a -> Odd a b
128 | (x :: xs) ++ ys = x :: xs ++ ys
133 | Semigroup a => Semigroup (Odd a b) where
134 | [x] <+> (y :: ys) = (x <+> y) :: ys
135 | (x :: y :: xs) <+> ys = x :: y :: xs <+> ys
139 | (+>) : Semigroup a => Odd a b -> a -> Odd a b
140 | [x] +> z = [x <+> z]
141 | x :: y :: xs +> z = x :: y :: (xs +> z)
144 | (<+) : Semigroup a => a -> Odd a b -> Odd a b
145 | x <+ y :: ys = (x <+> y) :: ys
148 | Semigroup (Even a b) where
152 | Monoid a => Monoid (Odd a b) where
153 | neutral = [neutral]
156 | Monoid (Even a b) where
160 | Foldable (Odd a) where
161 | foldr = bifoldr (flip const)
162 | foldl = bifoldl const
165 | singleton : a -> Odd a b
170 | Monoid a => Applicative (Odd a) where
171 | pure x = [neutral, x, neutral]
172 | fs <*> xs = biconcatMap singleton (flip map xs) fs
175 | flatten : Odd (Odd a b) b -> Odd a b
177 | flatten (x :: y :: xs) = x ++ (y :: flatten xs)
181 | [FstApplicative] Applicative (\a => Odd a b) using FstFunctor where
183 | fs <*> xs = flatten $
bimap (flip mapFst xs) id fs
186 | Monoid a => Alternative (Odd a) where
188 | xs <|> ys = xs <+> ys
192 | [SndMonad] Monoid a => Monad (Odd a) where
193 | x >>= f = assert_total $
biconcatMap singleton f x
196 | (>>=) : Monoid a => Odd a b -> (b -> Odd a c) -> Odd a c
197 | (>>=) = (>>=) @{SndMonad}
201 | [FstMonad] Monad (\a => Odd a b) using FstApplicative where
202 | x >>= f = flatten $
mapFst f x
206 | (>>=) : Odd a c -> (a -> Odd b c) -> Odd b c
207 | (>>=) = (>>=) @{FstMonad}
210 | Traversable (Odd a) where
211 | traverse = bitraverse pure
216 | odds : Odd a b -> List a
217 | odds (x :: xs) = x :: evens xs
221 | evens : Even a b -> List b
223 | evens (x :: xs) = odds xs
228 | evens : Odd a b -> List b
229 | evens (x :: xs) = odds xs
233 | odds : Even a b -> List a
235 | odds (x :: xs) = x :: evens xs
240 | forget : Odd a a -> List a
241 | forget (x :: xs) = x :: forget xs
245 | forget : Even a a -> List a
247 | forget (x :: xs) = x :: forget xs
250 | Show a => Show b => Show (Odd a b) where
251 | show xs = "[\{concat $ intersperse ", " $ forget $ bimap show show xs}]"
254 | Show a => Show b => Show (Even a b) where
255 | show xs = "[\{concat $ intersperse ", " $ forget $ bimap show show xs}]"