module Twist where data Twist a b = Twil | Twons a (Twist b a) tmap :: (a->c) -> (b->d) -> Twist a b -> Twist c d tmap f g Twil = Twil tmap f g (Twons a bas) = Twons (f a) (tmap g f bas) list Twil = [] list (Twons x xs) = x : list xs instance (Show a, Show b) => Show (Twist a b) where show Twil = "[]" show abs = "[" ++ sep (list (tmap show show abs)) ++ "]" where sep = foldl1 (\x y -> x ++ ", " ++ y) twip :: [a] -> [b] -> Twist a b twip (x:xs) ys = Twons x (twip ys xs) twip [] ys = Twil twap :: (a->c) -> (b->c) -> Twist a b -> [c] twap f g Twil = [] twap f g (Twons a bs) = f a : twap g f bs len :: Twist a b -> Int len Twil = 0 len (Twons _ abs) = 1 + len abs {- Sample runs: > twip "abcd" [1..5] ['a', 1, 'b', 2, 'c', 3, 'd', 4] > twap ord id $$ [97,1,98,2,99,3,100,4] > sum $$ 404 > twip "abcd" [1..5] ['a', 1, 'b', 2, 'c', 3, 'd', 4] > tmap (:[]) even $$ ["a", False, "b", True, "c", False, "d", True] > len $$ 8 -}