Abbie's Haskell compiler
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

44 lines
1.4 KiB

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
module Ahc.Data.Lens.Tuple where
import Ahc.Data.Lens
import Data.Functor.Identity
class Field1 s t a b | s -> a, t -> b, s b -> t, t a -> s where
_1 :: Lens s t a b
instance Field1 (Identity a) (Identity a) a a where
_1 = lens runIdentity (\_ x -> Identity x)
instance Field1 (a, b) (a', b) a a' where
_1 = lens (\(~(x, _)) -> x) (\(~(_, y)) x -> (x, y))
instance Field1 (a, b, c) (a', b, c) a a' where
_1 = lens (\(~(x, _, _)) -> x) (\(~(_, y, z)) x -> (x, y, z))
instance Field1 (a, b, c, d) (a', b, c, d) a a' where
_1 = lens (\(~(x, _, _, _)) -> x) (\(~(_, y, z, a)) x -> (x, y, z, a))
class Field2 s t a b | s -> a, t -> b, s b -> t, t a -> s where
_2 :: Lens s t a b
instance Field2 (a, b) (a, b') b b' where
_2 = lens (\(~(_, y)) -> y) (\(~(x, _)) y -> (x, y))
instance Field2 (a, b, c) (a, b', c) b b' where
_2 = lens (\(~(_, x, _)) -> x) (\(~(x, _, z)) y -> (x, y, z))
instance Field2 (a, b, c, d) (a, b', c, d) b b' where
_2 = lens (\(~(_, x, _, _)) -> x) (\(~(x, _, z, a)) y -> (x, y, z, a))
class Field3 s t a b | s -> a, t -> b, s b -> t, t a -> s where
_3 :: Lens s t a b
instance Field3 (a, b, c) (a, b, c') c c' where
_3 = lens (\(~(_, _, x)) -> x) (\(~(x, y, _)) z -> (x, y, z))
instance Field3 (a, b, c, d) (a, b, c', d) c c' where
_3 = lens (\(~(_, _, x, _)) -> x) (\(~(x, y, _, a)) z -> (x, y, z, a))