homotuple (empty) → 0.1.0.0
raw patch · 9 files changed
+510/−0 lines, 9 filesdep +OneTupledep +Onlydep +basesetup-changed
Dependencies added: OneTuple, Only, base, single-tuple
Files
- ChangeLog.md +7/−0
- LICENSE +13/−0
- README.md +1/−0
- Setup.hs +2/−0
- homotuple.cabal +48/−0
- src/Data/Tuple/Homotuple.hs +349/−0
- src/Data/Tuple/Homotuple/Identity.hs +30/−0
- src/Data/Tuple/Homotuple/OneTuple.hs +30/−0
- src/Data/Tuple/Homotuple/Only.hs +30/−0
+ ChangeLog.md view
@@ -0,0 +1,7 @@+# Changelog for homotuple++## 0.1.0.0++2019.10.10++Release.
+ LICENSE view
@@ -0,0 +1,13 @@+Copyright 2019 Kazuki Okamoto++Licensed under the Apache License, Version 2.0 (the "License");+you may not use this file except in compliance with the License.+You may obtain a copy of the License at++ http://www.apache.org/licenses/LICENSE-2.0++Unless required by applicable law or agreed to in writing, software+distributed under the License is distributed on an "AS IS" BASIS,+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+See the License for the specific language governing permissions and+limitations under the License.
+ README.md view
@@ -0,0 +1,1 @@+# homotuple
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ homotuple.cabal view
@@ -0,0 +1,48 @@+cabal-version: 1.12 ++-- This file has been generated from package.yaml by hpack version 0.31.1.+--+-- see: https://github.com/sol/hpack+--+-- hash: bf3e190ee92c45cf9f906b2ac73da62207735e115f856db4fc9fe116bdd7f963++name: homotuple+version: 0.1.0.0+synopsis: Homotuple, all whose elements are the same type+description: Homotuple, all whose elements are the same type+category: Data+homepage: https://github.com/kakkun61/homotuple#readme+bug-reports: https://github.com/kakkun61/homotuple/issues+author: Kazuki Okamoto+maintainer: kazuki.okamoto@kakkun61.com+copyright: 2019 Kazuki Okamoto+license: Apache+license-file: LICENSE+build-type: Simple+extra-source-files:+ README.md+ ChangeLog.md++source-repository head+ type: git+ location: https://github.com/kakkun61/homotuple++library+ exposed-modules:+ Data.Tuple.Homotuple+ Data.Tuple.Homotuple.Identity+ Data.Tuple.Homotuple.OneTuple+ Data.Tuple.Homotuple.Only+ other-modules:+ Paths_homotuple+ hs-source-dirs:+ src+ ghc-options: -Wall -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates -Wmonomorphism-restriction -Wmissing-exported-signatures -Wmissing-export-lists -Wmissing-home-modules -Wmissing-import-lists -Widentities -Wredundant-constraints -Wpartial-fields -Wno-name-shadowing+ build-depends:+ OneTuple >=0.2 && <0.3+ , Only >=0.1 && <0.2+ , base >=4.12 && <4.13+ , single-tuple >=0.1 && <0.2+ if impl(ghc >= 8.6.1)+ default-extensions: NoStarIsType+ default-language: Haskell2010
+ src/Data/Tuple/Homotuple.hs view
@@ -0,0 +1,349 @@+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeFamilyDependencies #-}+{-# LANGUAGE TypeOperators #-}++{-# OPTIONS_GHC -Wno-orphans #-}++{-# OPTIONS_HADDOCK show-extensions #-}++-- |+-- Copyright : Kazuki Okamoto+-- License : see LICENSE+-- Maintainer : kazuki.okamoto@kakkun61.com+-- Stability : experimental+-- Portability : GHC+--+-- Homotuples, whoes items are the same type or which are lists with type-level length.++module Data.Tuple.Homotuple+ ( Homotuple+ -- * List-like+ , replicate+ -- * Functor-like+ , (<$>)+ -- * Applicative-like+ , (<*>)+ , pure+ -- * Monad-like+ , (>>=)+ -- * Semigoupe-like+ , (<>)+ -- * Monoid-like+ , pattern Empty+ -- * Utility constraints+ , IsHomolisttuple+ , IsHomotupleItem+ -- * For implementers+ , errorLengthMismatch+ ) where++import Prelude (Num (fromInteger), error, ($), (.))++import qualified Control.Applicative as A+import qualified Control.Monad as M+import Data.Kind (Type)+import qualified Data.List as L+import Data.Proxy (Proxy (Proxy))+import qualified Data.Semigroup as S+import Data.Tuple.Single (Single (wrap))+import GHC.Exts (IsList (Item, fromList, toList))+import GHC.Stack (HasCallStack)+import GHC.TypeLits (type (*), type (+), KnownNat, Nat, natVal)++type family Homotuple (n :: Nat) (a :: Type) = (t :: Type) | t -> n++type instance Homotuple 0 a = Proxy a++type instance Homotuple 2 a = (a, a)++type instance Homotuple 3 a = (a, a, a)++type instance Homotuple 4 a = (a, a, a, a)++type instance Homotuple 5 a = (a, a, a, a, a)++type instance Homotuple 6 a = (a, a, a, a, a, a)++type instance Homotuple 7 a = (a, a, a, a, a, a, a)++type instance Homotuple 8 a = (a, a, a, a, a, a, a, a)++type instance Homotuple 9 a = (a, a, a, a, a, a, a, a, a)++type instance Homotuple 10 a = (a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 11 a = (a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 12 a = (a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 13 a = (a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 14 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 15 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 16 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 17 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 18 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 19 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 20 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 21 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 22 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 23 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 24 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 25 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 26 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 27 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 28 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 29 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 30 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 31 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 32 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 33 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 34 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 35 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 36 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 37 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 38 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 39 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 40 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 41 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 42 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 43 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 44 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 45 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 46 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 47 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 48 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 49 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 50 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 51 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 52 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 53 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 54 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 55 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 56 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 57 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 58 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 59 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 60 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 61 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++type instance Homotuple 62 a = (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)++instance IsList (Proxy a) where+ type Item (Proxy a) = a+ fromList [] = Proxy+ fromList _ = errorLengthMismatch+ toList _ = []++instance IsList (a, a) where+ type Item (a, a) = a+ fromList [a, b] = (a, b)+ fromList _ = errorLengthMismatch+ toList (a, b) = [a, b]++instance IsList (a, a, a) where+ type Item (a, a, a) = a+ fromList [a, b, c] = (a, b, c)+ fromList _ = errorLengthMismatch+ toList (a, b, c) = [a, b, c]++instance IsList (a, a, a, a) where+ type Item (a, a, a, a) = a+ fromList [a, b, c, d] = (a, b, c, d)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d) = [a, b, c, d]++instance IsList (a, a, a, a, a) where+ type Item (a, a, a, a, a) = a+ fromList [a, b, c, d, e] = (a, b, c, d, e)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e) = [a, b, c, d, e]++instance IsList (a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f] = (a, b, c, d, e, f)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f) = [a, b, c, d, e, f]++instance IsList (a, a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f, g] = (a, b, c, d, e, f, g)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f, g) = [a, b, c, d, e, f, g]++instance IsList (a, a, a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f, g, h] = (a, b, c, d, e, f, g, h)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f, g, h) = [a, b, c, d, e, f, g, h]++instance IsList (a, a, a, a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f, g, h, i] = (a, b, c, d, e, f, g, h, i)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f, g, h, i) = [a, b, c, d, e, f, g, h, i]++instance IsList (a, a, a, a, a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f, g, h, i, j] = (a, b, c, d, e, f, g, h, i, j)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f, g, h, i, j) = [a, b, c, d, e, f, g, h, i, j]++instance IsList (a, a, a, a, a, a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f, g, h, i, j, k] = (a, b, c, d, e, f, g, h, i, j, k)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f, g, h, i, j, k) = [a, b, c, d, e, f, g, h, i, j, k]++instance IsList (a, a, a, a, a, a, a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a, a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f, g, h, i, j, k, l] = (a, b, c, d, e, f, g, h, i, j, k, l)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f, g, h, i, j, k, l) = [a, b, c, d, e, f, g, h, i, j, k, l]++instance IsList (a, a, a, a, a, a, a, a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a, a, a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f, g, h, i, j, k, l, m] = (a, b, c, d, e, f, g, h, i, j, k, l, m)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f, g, h, i, j, k, l, m) = [a, b, c, d, e, f, g, h, i, j, k, l, m]++instance IsList (a, a, a, a, a, a, a, a, a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a, a, a, a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f, g, h, i, j, k, l, m, n] = (a, b, c, d, e, f, g, h, i, j, k, l, m, n)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f, g, h, i, j, k, l, m, n) = [a, b, c, d, e, f, g, h, i, j, k, l, m, n]++instance IsList (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a) where+ type Item (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a) = a+ fromList [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o] = (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)+ fromList _ = errorLengthMismatch+ toList (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) = [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o]++errorLengthMismatch :: HasCallStack => a+errorLengthMismatch = error "length mismatch"++-- Utility constraints++type IsHomolisttuple (n :: Nat) a = IsList (Homotuple n a)+type IsHomotupleItem (n :: Nat) a = a ~ Item (Homotuple n a)++-- List-like++replicate :: forall (n :: Nat) a. (IsHomolisttuple n a, IsHomotupleItem n a, KnownNat n) => a -> Homotuple n a+replicate = fromList . L.replicate (fromInteger $ natVal (Proxy :: Proxy n))++-- Functor-like++(<$>)+ :: ( IsHomolisttuple n a+ , IsHomolisttuple n b+ , IsHomotupleItem n a+ , IsHomotupleItem n b+ )+ => (a -> b) -> Homotuple n a -> Homotuple n b+f <$> t = fromList $ L.map f $ toList t++-- Applicative-like++(<*>)+ :: ( IsHomolisttuple n0 (a -> b)+ , IsHomolisttuple n1 a+ , IsHomolisttuple (n0 * n1) b+ , IsHomotupleItem n0 (a -> b)+ , IsHomotupleItem n1 a+ , IsHomotupleItem (n0 * n1) b+ )+ => Homotuple n0 (a -> b) -> Homotuple n1 a -> Homotuple (n0 * n1) b+f <*> t = fromList $ toList f A.<*> toList t++pure :: Single c => a -> c a+pure = wrap++-- Monad-like++(>>=)+ :: ( IsHomolisttuple n0 a+ , IsHomolisttuple n1 b+ , IsHomolisttuple (n0 * n1) b+ , IsHomotupleItem n0 a+ , IsHomotupleItem n1 b+ , IsHomotupleItem (n0 * n1) b+ )+ => Homotuple n0 a -> (a -> Homotuple n1 b) -> Homotuple (n0 * n1) b+m >>= f = fromList $ toList m M.>>= (toList . f)++-- Semigroup-like++(<>)+ :: ( IsHomolisttuple n0 a+ , IsHomolisttuple n1 a+ , IsHomolisttuple (n0 + n1) a+ , IsHomotupleItem n0 a+ , IsHomotupleItem n1 a+ , IsHomotupleItem (n0 + n1) a+ )+ => Homotuple n0 a+ -> Homotuple n1 a+ -> Homotuple (n0 + n1) a+a <> b = fromList $ toList a S.<> toList b++infixr 6 <>++-- Monoid-like++pattern Empty :: Homotuple 0 a+pattern Empty = Proxy
+ src/Data/Tuple/Homotuple/Identity.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeFamilies #-}++{-# OPTIONS_GHC -Wno-orphans #-}++{-# OPTIONS_HADDOCK show-extensions #-}++-- |+-- Copyright : Kazuki Okamoto+-- License : see LICENSE+-- Maintainer : kazuki.okamoto@kakkun61.com+-- Stability : experimental+-- Portability : GHC+--+-- Single homotuples.++module Data.Tuple.Homotuple.Identity () where++import Data.Functor.Identity (Identity (Identity))+import Data.Tuple.Homotuple (Homotuple, errorLengthMismatch)+import GHC.Exts (IsList (Item, fromList, toList))++type instance Homotuple 1 a = Identity a++instance IsList (Identity a) where+ type Item (Identity a) = a+ fromList [a] = Identity a+ fromList _ = errorLengthMismatch+ toList (Identity a) = [a]
+ src/Data/Tuple/Homotuple/OneTuple.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeFamilies #-}++{-# OPTIONS_GHC -Wno-orphans #-}++{-# OPTIONS_HADDOCK show-extensions #-}++-- |+-- Copyright : Kazuki Okamoto+-- License : see LICENSE+-- Maintainer : kazuki.okamoto@kakkun61.com+-- Stability : experimental+-- Portability : GHC+--+-- Single homotuples.++module Data.Tuple.Homotuple.OneTuple () where++import Data.Tuple.Homotuple (Homotuple, errorLengthMismatch)+import Data.Tuple.OneTuple (OneTuple (OneTuple))+import GHC.Exts (IsList (Item, fromList, toList))++type instance Homotuple 1 a = OneTuple a++instance IsList (OneTuple a) where+ type Item (OneTuple a) = a+ fromList [a] = OneTuple a+ fromList _ = errorLengthMismatch+ toList (OneTuple a) = [a]
+ src/Data/Tuple/Homotuple/Only.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE Trustworthy #-}+{-# LANGUAGE TypeFamilies #-}++{-# OPTIONS_GHC -Wno-orphans #-}++{-# OPTIONS_HADDOCK show-extensions #-}++-- |+-- Copyright : Kazuki Okamoto+-- License : see LICENSE+-- Maintainer : kazuki.okamoto@kakkun61.com+-- Stability : experimental+-- Portability : GHC+--+-- Single homotuples.++module Data.Tuple.Homotuple.Only () where++import Data.Tuple.Homotuple (Homotuple, errorLengthMismatch)+import Data.Tuple.Only (Only (Only))+import GHC.Exts (IsList (Item, fromList, toList))++type instance Homotuple 1 a = Only a++instance IsList (Only a) where+ type Item (Only a) = a+ fromList [a] = Only a+ fromList _ = errorLengthMismatch+ toList (Only a) = [a]